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

Alb*_*nke 117 c# asynchronous async-await c#-5.0 asp.net-web-api

一点背景资料.

我正在学习Web API堆栈,我正在尝试使用Success和ErrorCodes等参数以"Result"对象的形式封装所有数据.

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

为了节省一些时间并且还要了解有关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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想编写一个方法,对Result对象执行操作并返回它.通常通过同步方法

public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
    T result = new T();
    resultBody(result);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

但是如何使用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?
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 264

async当量Action<T>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;
}
Run Code Online (Sandbox Code Playgroud)

  • @DFSFOT:“void”方法的异步等价物是“Task”返回方法;因此,“Action”的异步等效项是“Func&lt;Task&gt;”,“Action&lt;T&gt;”的异步等效项是“Func&lt;T, Task&gt;”。更多信息[此处](https://blog.stephencleary.com/2014/02/synchronous-and-asynchronous-delegate.html)。 (4认同)
  • @JohnB:不;`Func&lt;T, Task&gt;` 是一个异步方法,它接受类型为 `T` 的参数并且没有返回值。`Func&lt;Task&lt;T&gt;&gt;` 是一个异步方法,不带任何参数并返回一个 `T` 类型的值。 (3认同)
  • @DFSFOT:异步方法在没有返回值时应该返回“Task”。如果它使用“async”关键字,那么实际的“Task”实例将由状态机创建,而不是直接由函数创建。 (2认同)