13

ちょっとした質問があります。

.Net 4.5 より前はマルチスレッドをあまり使用していなかったことを認めますが、新しいasync/await機能を試してみることにしました。私はそれを試し始めましたが、すべてうまくいっているように見えますが、ウェブ上のどこにも「問題」の解決策を見つけることができませんでした.

await.Net プラットフォームの新しく変換されたメソッド (例: など) で を使用する方法をWriteAsync()誰もが説明してReadAsync()いますが、それを自分のメソッドに使用したい場合はどうすればよいでしょうか? たとえば、非常にコストのかかる計算を実行していて、4 つのコアすべてをその計算に使用したいとします。私はこれに似たものを持っています:

async Task DoLotsOfWork<T>(T[] data, int start, int end)
{
    //Do very expensive work
}

しかし、awaitそこにはキーワードがないため、メソッドは同期メソッドとして扱われます。ユーザーにわかりやすいものを表示しながら、すべてのコアで実行できるように、外部から 4 回呼び出したいと思います (「お待ちください...」など)。私が理解できた唯一の解決策await Task.Yield();は、メソッドの先頭に a を追加することでした。このようなもの:

async Task DoLotsOfWork<T>(T[] data, int start, int end)
{
    await Task.Yield();
    //Do very expensive work
}

その場合、メソッドは期待どおりに動作します。しかし、これに対するより良い解決策はありますか? そのコード行を正確に書くよりも簡単で賢明なはずだと思います。Task/Threadオブジェクトを作成してメソッドを呼び出すことができることは理解していますStart()が、それにはさらに多くの作業が必要です。新しい async/await 機能を使えば、この種のことは簡単になると思いました。

4

1 に答える 1

18

したがって、最初に、非常に高価な作業を同期的に実行するメソッドが必要になります。

public void DoLotsOfWork<T>(T[] data, int start, int end) 
{
    Thread.Sleep(5000);//placeholder for real work
}

次にTask.Run、この作業の複数のインスタンスをスレッドプールスレッドで開始するために使用できます。

List<Task> tasks = new List<Task>();
for(int i = 0; i < 4; i++)
{
    tasks.Add(Task.Run(()=>DoLotsOfWork(data, start, end));
}

次に、すべてが完了するまでノンブロッキング待機を実行できます。

await Task.WhenAll(tasks);
于 2013-03-07T15:02:27.600 に答える