2009-06-14 5 views
1

メインスレッドが新しいタスクを作成する簡単なコードがいくつかあります。タスクは、複数の子タスクを順番に生成します。 メインスレッドは、親タスクで「待機」します。私は、プログラムの複数回にわたって同じ出力を得られないことに気づいています。下のコードでは、各タスクの反復変数の値を出力していますが、異なる実行間ではサブセットのみが出力されます。私は実行が注文されていないことを理解しますが、私は100の数字が(特定の順序で)印刷されることを期待しているという点でまだ完全でなければならないでしょう。 Waitを呼び出すと、すべての子タスクが完了するのを待つことはありませんか? 私はMSDNパー子タスクを実行して生成するときに一貫性のない結果が発生する

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()); 
    } 
+0

は、同時実行の問題 – Kareem

答えて

4

VS2010チームシステムのベータ1を実行しているよ、あなたはもっと待っまたは他の同期必要、と私は引用: 「」」あなたは仕事で待機すると 、あなたが暗黙のうちに、すべての子どもたちを待ちます "" "

ここで、親は親を待っていますが、親の子は実際には分離されて作成されているため、そのタスクはDetachedFromParentオプションを使用して作成されたものではありません。 なしメインが暗黙的に待つようにする子供も同様に、メイン(したがってプロセス全体)は、いくつかの子タスクが実行される前に終了し、しばしば終了します。

+0

うんのように聞こえるDetachedFromParentオプションを使用し、私は(当たり前) –

2

私のミス:私は誤って子供を作成するときに

Task.Factory.StartNew(() => 
      { 
       Write(localInt); 
      }, TaskCreationOptions.DetachedFromParent); 
+0

右を掲示した後、私はそれが私が説明したものだ、私のミス秒を実現しました上記の私の答え(あなたがこの "自己回答"を投稿する直前)。私はそれが間違いであることを知ることはできませんでした。(すべての孫が自由に走り、メインで待っていてもらいたい)自然なことですが、Task Parallel Libraryではうまく動作しませんそれは今日立つ。 –

+0

心配はありません...あなたが言いましたパラダイムは、あなたの子供の所有権を放棄して、あなたが明示的にこれらの仕事を「追跡」し、あなたがいれば完了することを保証するという意味で、これらのタスクの結果に応じて計算します –

+0

PS - あなたが私のねじが上がった直前 –

関連する問題