0

私はTPLをいじっていて、非常に奇妙なことを見つけました。Waitコードはタスクが終了するのを待ち、このダミー テストを実行すると、呼び出し後にいくつかのタスクが実行されたことがわかりました。何か足りないのですか、それとも TPL の問題ですか?

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Task tareas = null;

            Console.WriteLine("Start process");
            for (int i = 0; i < 4000; i++)
            {
                var n = i.ToString();
                tareas = Task.Factory.StartNew(() =>
                {
                    var random = new Random();
                    Thread.Sleep(random.Next(200, 500));

                    Console.WriteLine("Task completed: " + n);
                });
            }

            tareas.Wait();

            Console.WriteLine("Process end");

            Console.Read();
        }
    }
}

出力:

Start process
Task completed: 4
Task completed: 3

...

End process
Task completed: 3996
Task completed: 3991
Task completed: 3993
4

3 に答える 3

2

まあ、最後に作成したタスクが完了するのをtareas.Wait();待つだけです。タスクはランダムな時間で完了するため、作成した最後のタスクが完了しても一部のタスクがまだ完了していないことはまったく正常です。

以下に、起こりうる例を示します。

Task 1 created
Task 2 created
Task 3 created
Task 4 created

Task 1 completed
Task 3 completed

Wait for task 4 completion
Task 4 completed

// task 2 executed during more time than other 
// tasks because of the random value the thread waited
Task 2 completed
于 2013-03-28T17:36:59.933 に答える
1

他の人が指摘しているように、最後にスケジュールされた 1 つのタスクのみを待機しています。

デフォルトでスケジュールされたタスクは、ここでTaskScheduler説明されているように、スレッド プールを使用して作業項目を実行します。このスケジューラでは、順序は保証されません。フレームワークは、プール内の各スレッドで実行されているキューのバランスをとろうとしますが、最後にスケジュールされたタスクが配置されたキューが、他のキューよりも前にすべてのタスクの実行を終了する可能性があります (珍しいことではありません)。

これは、Wait. リンクしたドキュメントの「タスクのインライン化」というラベルの付いたセクションを確認してください。タスクが待機中の場合、待機を実行しているスレッドは「まあ、このタスクが完了するまで何もできません。先に進み、自分で実行できます。」その場合、タスクはスレッド プール キューから完全に削除されます。

于 2013-03-28T17:41:06.193 に答える
0

taereas には最後に作成されたスレッドへの参照が含まれるため、treas.Wait() は最後のスレッドが終了するまで待機するため、最後のスレッドが終了した後でも他のスレッドが実行される可能性があります。

于 2013-03-28T17:39:23.267 に答える