一点背景资料。
我正在学习Web API堆栈,并且正在尝试以带有诸如Success和ErrorCodes之类的参数的“结果”对象的形式封装所有数据。
但是,不同的方法将产生不同的结果和错误代码,但是结果对象通常将以相同的方式实例化。
为了节省时间并进一步了解C#中的异步/等待功能,我试图将Web api操作的所有方法体包装在异步操作委托中,但遇到了一些麻烦...
给定以下类别:
public class Result
{
public bool Success { get; set; }
public List<int> ErrorCodes{ get; set; }
}
public async Task<Result> GetResultAsync()
{
return await DoSomethingAsync<Result>(result =>
{
// Do something here
result.Success = true;
if (SomethingIsTrue)
{
result.ErrorCodes.Add(404);
result.Success = false;
}
}
}
我想编写一个对Result对象执行操作并返回它的方法。通常通过同步方法
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
T result = new T();
resultBody(result);
return result;
}
但是,如何使用async / await将这种方法转换为异步方法呢?
这是我尝试过的:
public async Task<T> DoSomethingAsync<T>(Action<T, Task> resultBody)
where T: Result, new()
{
// But I don't know what do do from here.
// What do I await?
}
抱歉,我对此还不是很陌生,当您说只需要传播时,您是什么意思?对T进行新的处理与它有什么关系?
—
Albin Anke
我想我已经解决了,谢谢毫微微,您给了我一些思考。
—
Albin Anke 2013年
您为什么还要尝试异步执行此操作?在非Web服务器情况下,通常通过将同步代码包装在任务中(例如您尝试执行的操作)来进行虚假异步操作,比仅同步进行操作要慢。
—
Scott Chamberlain
@AlbinAnke通过“传播”我的意思是,如果你调用像.NET方法
—
millimoose
Stream.ReadAsync()
中的方法,该方法本身应该是异步的,并返回一个Task<T>
地方T
是你不得不返回了该方法的同步。想法是这样,您的方法的每个调用者都可以随后“异步等待”(我不知道这是什么好术语)Stream.ReadAsync()
来完成基础。可以使用的一个比喻是,异步是“传染性的”,并且从底层的内置I / O传播到其他代码,这些代码的结果取决于所述I / O的结果。
new
启动T
,为什么您的方法需要异步?使用异步API的代码中的AFAIK ,您只需传播所async
使用的其他方法的本质即可。