如何实现异步操作委托方法?

一点背景资料。

我正在学习 Web API 堆栈,并试图用参数(如 SuccessErrorCodes)以“ 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?
}
103868 次浏览

因此,我认为实现这一点的方法是:

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

相当于 Action<T>asyncFunc<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;
}