4

TPLを把握しようとしています。

楽しみのために、ランダムなスリープでいくつかのタスクを作成して、それがどのように処理されるかを確認してみました。私は火を狙っていて、パターンを忘れていました..

static void Main(string[] args)
    {
        Console.WriteLine("Demonstrating a successful transaction");

        Random d = new Random();
        for (int i = 0; i < 10; i++)
        {
            var sleep = d.Next(100, 2000);


            Action<int> succes = (int x) =>
            {
                Thread.Sleep(x);
                Console.WriteLine("sleep={2}, Task={0}, Thread={1}: Begin successful transaction",
                   Task.CurrentId, Thread.CurrentThread.ManagedThreadId, x);
            };

            Task t1 = Task.Factory.StartNew(() => succes(sleep));
        }
        Console.ReadLine();
    }

しかし、スリープ(ランダム)を無視してすべての行をコンソールに出力する理由がわかりません

誰かが私にそれを説明できますか?

4

3 に答える 3

7

重要:

TPL のデフォルトの TaskScheduler は、タスクごとのスレッドを保証しません。1 つのスレッドを複数のタスクの処理に使用できます。

Thread.Sleep を呼び出すと、他のタスクのパフォーマンスに影響を与える可能性があります。

TaskCreationOptions.LongRunningヒントを使用してタスクを作成すると、TaskScheduler がタスク専用のスレッドを割り当て、安全にブロックすることができます。

于 2011-12-29T15:50:12.207 に答える
2

コードは、生成された乱数の代わりにiの値を使用します。スリープを無視するのではなく、反復ごとに 0 から 10 ミリ秒の間でスリープします。

試す:

Thread.Sleep(sleep);
于 2010-10-29T09:23:45.647 に答える
0

タスク t1 = Task.Factory.StartNew(() => 成功 (スリープ));

タスクを作成して自動的に開始し、タスクがプロセスを終了するのを待たずに for 内で再度反復します。そのため、2 番目のタスクが作成されて実行されると、最初のタスクが終了する場合があります。タスクが終了するのを待っていないということです。

試してみてください

Task t1 = Task.Factory.StartNew(() => succes(sleep)); 
t1.Wait();
于 2011-09-29T15:16:23.070 に答える