だから私はについてこの質問async
をしていました.
Task<..>...ContinueWith...
そして最後にResult
物件調査。
ここでそれについて質問したところ、次のように言われました。
しかし、今日、私はジョン・スキートによって修正されました
「それはとても遠い道のりです」。
では、これら 2 つのアプローチの主な違いは何ですか?
だから私はについてこの質問async
をしていました.
Task<..>...ContinueWith...
そして最後にResult
物件調査。
ここでそれについて質問したところ、次のように言われました。
しかし、今日、私はジョン・スキートによって修正されました
「それはとても遠い道のりです」。
では、これら 2 つのアプローチの主な違いは何ですか?
継続を追加していますが、その継続を手動で構築するのは、到達した場所とローカルの状態に関するすべての情報を持ち歩く必要があるため、非常に苦痛になる可能性があります。
非常に単純な例として、この非同期メソッドと同等のものを考えてみることをお勧めします。
public static async Task<int> SumTwoOperationsAsync()
{
var firstTask = GetOperationOneAsync();
var secondTask = GetOperationTwoAsync();
return await firstTask + await secondTask;
}
// These are just examples - you don't need to translate them.
private async Task<int> GetOperationOneAsync()
{
await Task.Delay(500); // Just to simulate an operation taking time
return 10;
}
private async Task<int> GetOperationTwoAsync()
{
await Task.Delay(100); // Just to simulate an operation taking time
return 5;
}
最初の方法と同等のものを実際に考えてみてください。特に毎回適切なスレッドに戻りたい場合は、かなり多くのコードが必要であることがわかると思います。(たとえば、その非同期メソッドのコードが WPF UI も変更したと想像してください。)ああ、いずれかのタスクが失敗した場合、返されたタスクも失敗することを確認してください。(非同期メソッドは、最初のタスクも失敗した場合、実際には 2 番目のタスクの失敗を「見逃す」ことになりますが、これは IMO では比較的小さな問題です。)
try
次に、メソッドで/finally
に相当するものが必要な場合、コードをどのように変更する必要があるかを考えますasync
。繰り返しますが、これは非非同期メソッドをより複雑にします。それはすべて行うことができますが、それは首の痛みです。
そうです、それは「単なる」シンタックス シュガーです。そうですforeach
。ループfor
(またはその他の種類のループ) も同様です。async
/の場合はawait
、コードを変換するためにかなり多くのことを実行できるシンタックス シュガーです。
async に関するビデオやブログ投稿はたくさんありますが、それらのいくつかを見たり読んだりするだけで、これがマイナーな調整とはほど遠いことを理解するのに十分な洞察が得られると思います。非同期コードの量を正しく。
さらに、パターンベースであるため、async/await は/でのみ機能するわけではありません。待機可能なパターンに準拠するものは何でも待機できます。実際には、パターンを自分で実装する必要がある開発者はほとんどいませんが、タスクではなくを返すなどのメソッドを使用できます。Task
Task<T>
Task.Yield
YieldAwaitable