だから、私は約async
this questionを求めていた、と私はそれがためだけに砂糖の構文だと考えた:砂糖の構文としてC#5の非同期(または非)?
Task<..>...ContinueWith...
そして最後にResult
プロパティを検査。
私もhereそれについて質問をし、私は言われた:
しかし、今日I was corrected by Jon Skeet
"それはそれとは非常に長い道のりです"。
これらの2つのアプローチの主な違いは何ですか?
だから、私は約async
this questionを求めていた、と私はそれがためだけに砂糖の構文だと考えた:砂糖の構文としてC#5の非同期(または非)?
Task<..>...ContinueWith...
そして最後にResult
プロパティを検査。
私もhereそれについて質問をし、私は言われた:
しかし、今日I was corrected by Jon Skeet
"それはそれとは非常に長い道のりです"。
これらの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;
}
は本当に第一の方法の同等を思い付くしてみてください。実際に毎回適切なスレッドに戻るには、かなり多くのコード(、特に)が必要であることがわかります。 (例えば、asyncメソッドがWPF UIを変更したというコードを想像してみてください)ああ、いずれかのタスクが失敗すると、返されたタスクも失敗することを確認してください。 (非同期メソッドは、最初のタスクも失敗した場合、2番目のタスクの失敗を実際に「見逃す」でしょうが、これは比較的小さな問題です)。
次に、コードを変更する必要があります/finally
の同等物がasync
メソッドで必要でした。この場合も、非同期メソッドは複雑になります。それはすべてできますが、首に痛みがあります。
はい、それは「ちょうど」構文的な砂糖です。だからforeach
です。 for
ループ(または他の種類のループ)もあります。 async
/await
の場合、コードを変換するのにかなり多くのことができる構文的な砂糖です。
あり非同期周りの動画やブログ記事のたくさんがあり、私はちょうどそれらのいくつかを読んで/視聴はあなたにここまでマイナーな微調整からであることを理解するのに十分な洞察力を与えるだろうと期待される:それは根本大量の非同期コードを正しく書き込むことが実際的であるかどうかを変更します。
はさらに、パターンベースであること、非同期/のawait Task
/Task<T>
でないだけ作業を行います。あなたは待っているパターンに忠実なものを待つことができます。実際には非常に少数の開発者が、パターン自体を実装する必要がありますが、それは仕事ではなくYieldAwaitable
を返しTask.Yield
のような方法が可能になります。
- ありがとうございました。 –
だから、「単なる」構文的砂糖ではありません!管理対象ILを参照してください。タスク
@hVostt:非同期/待機コードの* lots *を逆コンパイルしました。私はそれ以上の違いに驚かないだろうが、私はまだそれが「ちょうど」構文的砂糖だと思う。それは非常に便利で構文の砂糖がかなり複雑で、時にはC#4を使ってILと正確に*表すことができないコードですが、基本的にはこれまでできなかったことはありません。ジェネリックのようなものではありませんでした。これは型システムの基本的な転換でした。これはコンパイラがスマートになっているだけです。私はそれがどれほど有用であるかを見極めようとはしていません - 私は*愛*非同期です。しかしそれはまだ構文的な砂糖のIMOです。 –
*概念的* await' 'の使用はContinueWith''に似ていますが、 'await'はあなたが' ContinueWith'を自分で行う必要があるだろうというあなたのための世話をすることはほとんど細部がたくさんあります。 –
どのように答えをきれいにカットしましたか? :) –
@ YairNevetどちらか? –