web-dev-qa-db-ja.com

非同期アクションデリゲートメソッドをどのように実装しますか?

少しの背景情報。

Web APIスタックを学習しており、SuccessやErrorCodesなどのパラメーターを使用して、すべてのデータを「結果」オブジェクトの形式でカプセル化しようとしています。

ただし、異なるメソッドは異なる結果とエラーコードを生成しますが、結果オブジェクトは通常同じ方法でインスタンス化されます。

時間を節約し、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?
}
109
Albin Anke

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;
}
247
Stephen Cleary