1

次のように、タスクを作成して開始する while ループがあります。

while (!stopped)
{
    List<Task> tasks = new List<Task>();

    for (int i = 0; i < 10; i++)
        tasks.add(Task.Factory.StartNew(() => DoSomething(i)));

    Task.WaitAll(tasks.ToArray());
}

タスクが while ループの前に一度作成され、毎回再起動された場合 (関数に渡されるデータが変更されないため)、パフォーマンスが向上しますか?

4

2 に答える 2

0

コードに根本的な問題はありません。これは完全に受け入れられるアプローチです。TPL は、これまでとまったく同じように使用できるように特別に設計されているため、タスク作成のパフォーマンスやコストについて心配する必要はありません。

ただし、コードには大きな問題が1 つあります。ループ変数を閉じています。クロージャはではなく変数をキャプチャすることを忘れないでください。あなたのコードがメソッドを書く方法は、あなたがそうすべきだと思う値を使用しません。コードを次のように書き直す必要があります。DoSomethingi

while (!stopped) { List tasks = new List();

for (int i = 0; i < 10; i++)
{
    int capture = i;
    tasks.add(Task.Factory.StartNew(() => DoSomething(capture)));
}

Task.WaitAll(tasks.ToArray());

}

Parallel.For補足として、このメソッドを代替として使用できます。他に何もないとしても、ソリューションは間違いなくはるかにコンパクトです。

while (!stopped)
{
  Parallel.For(0, 10, i => DoSomething(i));
}
于 2013-10-25T14:51:34.227 に答える