2

次のようなループ内でタスクを作成することは可能ですか:

List<Task<string>> tasks = new List<Task<string>>();
for (int id = 0; id < 1000; id++)
{
    tasks.add(new Task<string>((tId) =>
        {
            var taskId = (int)tId;
            var rand = new Random(taskId);
            long sum = 0;
            for (int i = 0; i < 100000; i++)
            {
                sum += rand.Next(1000);
            }
            return string.Format("Task {0}: {1}", taskId, sum) ;
        }, id));
}

次に、次のようにすべてのタスクを開始します。

foreach (var task in tasks)
{
    task.Start();
}

次に、すべてが完了するのを待ちます。

Task.WaitAll(tasks.ToArray());

次に、結果を収集します。

foreach (var task in tasks)
{
    Console.WriteLine(task.Result);
}

このコードは機能していますが、並列度 (最大スレッド数) を制御できません。この慣行が正しいかどうかわかりませんか?

4

1 に答える 1

2

この MSDN アーティカルでは、タスク スケジューラ クラスをオーバーライドして、必要なものに到達する方法について説明しています。それは呼ばれLimitedConcurrencyLevelTaskSchedulerますが、小さなアドバイスです...私は2か月働いて、私の要件に対して絶対に節約できる高速なソリューションを取得したので、このタスクで多くの時間を調査する必要があります! その問題の他の解決策について検討する必要があります。

ところで、PLinq ライブラリとMaxDegreeofParallelismプロパティを調べることができます。しかし、mircosoft の開発者がセミナーで私に言ったように。それをしないでください!Task lib と PLinq lib はその分野で高度に最適化されているため、これを変更するとパフォーマンスに大きな問題が発生します

于 2013-08-04T16:12:42.640 に答える