你如何实现一个asynchronous操作委托方法?

一点背景资料。

我正在学习Web API堆栈,我试图用“Result”和“ErrorCodes”等参数封装所有数据。

但是,不同的方法会产生不同的结果和错误代码,但结果对象通常会以相同的方式实例化。

为了节省一些时间,也想了解更多关于asynchronous/等待C#中的function,我试图将我的web api动作的所有方法主体包装在一个asynchronous操作委托,但陷入了一个障碍…

鉴于以下类别:

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; } 

但是,如何将这个方法转换成asynchronous方法,使用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? } 

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; } 

所以我相信实现这个的方法是:

 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; }); }