1

メインスレッドが新しいタスクを作成している単純なコードがあります。次に、タスクは複数の子タスクを生成します。メイン スレッドは、親タスクで「待機」を行います。プログラムを複数回実行しても同じ出力が得られないことに気付きました。以下のコードでは、各タスクの反復変数の値を出力していますが、異なる実行ではサブセットのみが出力されます。実行が順序付けられていないことは理解していますが、100 個の数字が出力されることを期待しているため (特定の順序ではありません)、実行を完了する必要があります。Wait を呼び出すと、すべての子タスクが完了するまで待機しませんか? VS2010 Team system Beta1 を実行しています

 static void Main(string[] args)
    {
        Console.WriteLine("Main executing on ThreadID:- " + Thread.CurrentThread.ManagedThreadId.ToString());

        var task = Task.Factory.StartNew(WriteNumbers);
        task.Wait();

    }

    private static void WriteNumbers()
    {
        Console.WriteLine("WriteNumbers executing on ThreadID:- " + Thread.CurrentThread.ManagedThreadId.ToString());
        for (int i = 0; i < 100; i++)
        {
            int localInt = i;
            Task.Factory.StartNew(() => 
                {
                   Write(localInt);
                }, TaskCreationOptions.DetachedFromParent);
        }
    }

    private static void Write(int i)
    {            
        Console.WriteLine("Worker Thread executing on ThreadID:-" + Thread.CurrentThread.ManagedThreadId.ToString() + " Value:" + i.ToString());
    }
4

2 に答える 2

4

MSDNごとに、さらに待機またはその他の同期が必要です。引用します: """ タスクを待機する場合、それらの子が DetachedFromParent オプションを使用して作成されていない限り、そのタスクのすべての子を暗黙的に待機します。別途お待ちしております。

ここで、main は親を待機しますが、親の子は実際には切り離された状態で作成されているため、main も子を暗黙的に待機させるわけではありませ。走るチャンス。

于 2009-06-14T23:51:43.693 に答える
2

私の間違い: 子を作成するときに誤って DetachedFromParent オプションを使用しました

 Task.Factory.StartNew(() => 
            {
               Write(localInt);
            }, TaskCreationOptions.DetachedFromParent);
于 2009-06-14T23:51:53.770 に答える