一些背景信息
我正在学习Web API技术栈,并试图通过一个名为"Result
"的对象封装所有数据,包括Success
和ErrorCodes
等参数。
然而,不同的方法可能会产生不同的结果和错误代码,但结果对象通常会以相同的方式进行实例化。
为了节省时间并学习C#中的async
/await
功能,我正在尝试将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
,为什么你的方法需要是异步的?据我所知,在使用异步API的代码中,你只需要从你使用的其他方法传播"异步性"。 - millimooseStream.ReadAsync()
的.NET方法,则该方法本身应为异步,并返回一个Task<T>
,其中T
是如果该方法同步,您将返回的内容。这样做的想法是,因此您的每个方法的调用者都可以“异步等待”(我不知道这个术语的好处),以完成底层的Stream.ReadAsync()
。您可以使用的这种情况的比喻是,异步是“具有传染性的”,并从低级内置I/O蔓延到其他代码,其结果取决于所述I/O的结果。 - millimoose