2013-06-29 6 views
8

だから、私は約asyncthis questionを求めていた、と私はそれがためだけに砂糖の構文だと考えた:砂糖の構文としてC#5の非同期(または非)?

Task<..>...ContinueWith...

そして最後にResultプロパティを検査。

私もhereそれについて質問をし、私は言われた:

enter image description here

enter image description here

しかし、今日I was corrected by Jon Skeet

"それはそれとは非常に長い道のりです"。

これらの2つのアプローチの主な違いは何ですか?

+3

*概念的* await' 'の使用はContinueWith''に似ていますが、 'await'はあなたが' ContinueWith'を自分で行う必要があるだろうというあなたのための世話をすることはほとんど細部がたくさんあります。 –

+0

どのように答えをきれいにカットしましたか? :) –

+0

@ YairNevetどちらか? –

答えて

15

ですが、手作業で作成することで、私たちの所在地や地域の状態に関するすべての情報を持ち歩く必要があるため、手間がかかることがあります。

非常に簡単な例として、私はあなたがこの非同期メソッドの同等を思い付くしようと提案する:

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のような方法が可能になります。

+0

- ありがとうございました。 –

+0

だから、「単なる」構文的砂糖ではありません!管理対象ILを参照してください。タスクと非同期/待機を使用した場合と使用しない場合の違いに非常に驚くでしょう。 – hVostt

+2

@hVostt:非同期/待機コードの* lots *を逆コンパイルしました。私はそれ以上の違いに驚かないだろうが、私はまだそれが「ちょうど」構文的砂糖だと思う。それは非常に便利で構文の砂糖がかなり複雑で、時にはC#4を使ってILと正確に*表すことができないコードですが、基本的にはこれまでできなかったことはありません。ジェネリックのようなものではありませんでした。これは型システムの基本的な転換でした。これはコンパイラがスマートになっているだけです。私はそれがどれほど有用であるかを見極めようとはしていません - 私は*愛*非同期です。しかしそれはまだ構文的な砂糖のIMOです。 –

関連する問題