提问者:小点点

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


我正在学习Web API堆栈,并且我正在尝试以“结果”对象的形式封装所有数据,该对象带有诸如Success和errorcodes之类的参数。

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

为了节省一些时间,同时也为了更多地了解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;
        }
    }
}

我想写一个方法,它对一个结果对象执行一个动作并返回它。通常通过同步方法

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

共2个答案

匿名用户

actionasync等价物是func,因此我相信这就是您正在寻找的内容:

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

相关问题