5

バックグラウンドでタスクのリストを実行する Web サービス関数があります。すべてのタスクが完了すると、戻ります。C# 5 の関数を再検討しました。次のスニペットを機能させることができました。

var result = new List<int>();
var tasks = new List<Task<int>>();

foreach (var row in rowlist)
    tasks.Add(Task.Factory.StartNew(() => DoWork(row)));
foreach (var task in tasks)
    result.Add(task.Result);

個々のタスクが完了するのtask.Resultを待ちます。メソッドに 3 秒の遅延を追加し、DoWork10 個のタスクのリストに対して 5 秒未満で終了することを確認することで、これをテストしました。

async / awaitここで、新しい構文を使用して関数を書き直そうとしました。しかし、私はそれを機能させることができないようです。コンパイルされた場合、待機を追加することによって検証されるように、同期的に実行されます。

を使用して上記のスニペットを書き直す方法についてのアイデアはありますasync / awaitか?

4

2 に答える 2

2

Reed Copsey、Servy、Stephen Clearyの回答とコメントに基づいて、私はこのソリューションに進みました。

var results = rowlist
    .Select(row => Task.Run(() => DoWork(row)))
    .ToList()
    .Select(t => t.Result);

2つ目Selectは、タスクが完了するのを待ちます。ストリーミングを防ぐために間に追加しましたToList()が、それがなくても機能するようです。

于 2012-10-03T19:30:04.933 に答える