一点背景信息。
我正在学习Web API堆栈,并尝试将所有数据封装为带有Success
和ErrorCodes
等参数的"Result
“对象形式。
然而,不同的方法会产生不同的结果和错误代码,但结果对象通常会以相同的方式实例化。
为了节省一些时间,也为了更多地了解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?
}
发布于 2013-12-17 11:11:04
Action<T>
的async
等价物是Func<T, Task>
,所以我相信这就是您要找的:
public async Task<T> DoSomethingAsync<T>(Func<T, Task> resultBody)
where T : Result, new()
{
T result = new T();
await resultBody(result);
return result;
}
发布于 2013-12-17 10:32:17
因此,我认为实现这一点的方法是:
public Task<T> DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
return Task<T>.Factory.StartNew(() =>
{
T result = new T();
resultBody(result);
return result;
});
}
https://stackoverflow.com/questions/20624667
复制相似问题