C# (および VB) の新しい非同期機能と .NET 4.0 のTask Parallel Libraryの違いはわかりません。たとえば、ここからEric Lippert のコードを見てみましょう:
async void ArchiveDocuments(List<Url> urls) {
Task archive = null;
for(int i = 0; i < urls.Count; ++i) {
var document = await FetchAsync(urls[i]);
if (archive != null)
await archive;
archive = ArchiveAsync(document);
}
}
このawait
キーワードは 2 つの異なる目的を果たしているようです。最初の出現 ( FetchAsync
) は、「この値が後でメソッドで使用され、そのタスクが終了していない場合は、完了するまで待ってから続行する」という意味のようです。2 番目のインスタンス ( ) は、 「このタスクがまだ終了していない場合は、完了するまで今すぐarchive
待ってください」という意味のようです。私が間違っている場合は、私を修正してください。
こんな風に簡単に書けませんか?
void ArchiveDocuments(List<Url> urls) {
for(int i = 0; i < urls.Count; ++i) {
var document = FetchAsync(urls[i]); // removed await
if (archive != null)
archive.Wait(); // changed to .Wait()
archive = ArchiveAsync(document.Result); // added .Result
}
}
最初の値を実際に値が必要な場所に置き換え、2 つ目を待機が実際に発生await
している場所に置き換えました。機能は既に実装されており、意味的にはコードで実際に起こっていることにより近くなっています。Task.Result
await
Task.Wait()
(1)
(2)
メソッドがイテレータと同様にステートマシンとして書き直されることは理解していasync
ますが、それがもたらす利点もわかりません。動作に別のスレッドを必要とするコード (ダウンロードなど) は別のスレッドを必要とし、別のスレッドを必要としないコード (ファイルからの読み取りなど) は、TPL を利用して 1 つのスレッドのみで動作する可能性があります。
ここには明らかに何か大きなものが欠けています。誰かがこれをもう少しよく理解するのを手伝ってもらえますか?