4

私は現在 TPL を研究しており、期待される出力をまだ生成していない最初のテストを考え出しました。私のコードが間違っているのか、それとも期待される結果なのか私を困惑させているのは、待つだけの20の作業を開始していて、すべてのプロセスが5秒で完了することを期待していたという事実です。予想される 5 秒ではなく 10 秒かかります。

助けてくれてありがとう。

using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace ConsoleApplication3Task
{
    class Program
    {
        static void Main(string[] args)
        {
            var tasks = new List<Task<string>>();
            for (var i = 0; i < 20; i++)
            {
                var task = Task.Factory.StartNew<string>((index) =>
                    {
                        var start = DateTime.UtcNow;
                        Task.Delay(TimeSpan.FromSeconds(5)).Wait();
                        var end = DateTime.UtcNow;
                        return string.Format("start={0}, duration={1} for task={2}", start.TimeOfDay, (end - start).TotalSeconds, index);
                    }, i);
                tasks.Add(task);
            }
            Task.WaitAll(tasks.ToArray());
            tasks.ForEach((t) => Console.WriteLine(t.Result));
        }
    }
}

出力は次のとおりです。

start=10:07:19.8499784, duration=9,4992059 for task=0
start=10:07:19.8489785, duration=9,5002058 for task=1
start=10:07:19.8499784, duration=9,4992059 for task=2
start=10:07:19.8499784, duration=9,4992059 for task=3
start=10:07:19.8499784, duration=9,4992059 for task=4
start=10:07:19.8489785, duration=9,5002058 for task=5
start=10:07:19.8489785, duration=9,5002058 for task=6
start=10:07:19.8489785, duration=9,5002058 for task=7
start=10:07:20.8481051, duration=5,0016351 for task=8
start=10:07:21.8492322, duration=5,5006984 for task=9
start=10:07:22.8483595, duration=5,5046991 for task=10
start=10:07:23.8494862, duration=5,4996981 for task=11
start=10:07:24.8486135, duration=5,0006344 for task=12
start=10:07:25.8497402, duration=5,0116365 for task=13
start=10:07:25.8507412, duration=5,0106355 for task=14
start=10:07:26.8488675, duration=5,0096356 for task=15
start=10:07:27.3499306, duration=5,0076366 for task=16
start=10:07:27.3499306, duration=5,0076366 for task=17
start=10:07:28.3530586, duration=5,0126368 for task=18
start=10:07:28.3530586, duration=5,0126368 for task=19
Press any key to continue . . .
4

1 に答える 1

3

これが発生する理由は、TPL (実際にはスレッド プール) が、一度に作成できるスレッドの数を調整するためです。この動作は変更しないでください。一度にすべてのスレッドが起動され、問題が発生する可能性があるためです。

ただし、次のように使用することで、スレッド プールですぐに使用できるスレッドの数を増やすことThreadPool.SetMinThreads()できます。

ThreadPool.SetMinThreads(20, 20);

ただし、ほとんどの場合、これはテスト目的でのみ行う必要があります。

その行をプログラムの先頭に追加しようとすると、期待どおりに動作します。

また、実際の遅延は次の行から発生していることにも注意してください。

Task.Delay(TimeSpan.FromSeconds(5)).Wait();

これ.Wait()により、スレッドプール スレッドが実行され、すぐに開始されないように調整されています。

これを確認するには、その行を次のように変更します。

Thread.Sleep(TimeSpan.FromSeconds(5));

次に、スレッドを使用しなくても 5 秒かかることがわかります。ThreadPool.SetMinThreads(20, 20);

于 2013-06-07T10:21:42.650 に答える