少し背景情報。
私は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;
}
}
}
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?
}
申し訳ありませんが、これはまだかなり新しいのですが、伝達するだけでよいと言うとき、どういう意味ですか。
—
Albin Anke
私はそれを理解したと思います、ミリムースが私に何か考えてくれたことを感謝します。
—
Albin Anke
なぜこれを非同期にしようとするのですか?多くの場合、Webサーバーの状況ではなく、同期コードをタスクでラップすることによって偽の非同期を実行すること(実行しようとしているように)は、同期的に実行するよりも低速です。
—
スコットチェンバレン
@AlbinAnke「伝播」とは、メソッドのように.NETメソッドを呼び出す場合
—
millimoose 2013
Stream.ReadAsync()
、そのメソッド自体が非同期であり、同期したメソッドであったTask<T>
場所を返す場所を返すことを意味しますT
。このようにすると、メソッドのすべての呼び出し元は、基になるメソッドがStream.ReadAsync()
完了するまで「非同期に待機する」ことができます(これについて何がいいのかわかりません)。使用できるこれのメタファーは、非同期は「感染性」であり、低レベルの組み込みI / Oから、そのI / Oの結果に依存する結果を持つ他のコードに広がるということです。
new
あるのT
はなぜですか?非同期API を使用するコードでAFAIKasync
を使用する場合は、使用する他のメソッドからネスネスを伝達するだけで済みます。