6

一部のオブジェクトの初期化を非同期で実行したいのですが、一部のオブジェクトは他のオブジェクトの初期化に依存しています。そして、アプリケーションの残りの部分を続行する前に、すべてのオブジェクトを初期化する必要があります。

タスクで Wait() を呼び出し、後で再度 Wait() を呼び出すことは可能ですか? または、私の例のように、それが含まれているコレクションで WaitAll() を呼び出すことはできますか?

Dictionary<String, Task> taskdict = new Dictionary<String, Task>( );

   taskdict.Add( "Task1",
        Task.Factory.StartNew( ( ) => {
         //Do stuff
        } ) );

   taskdict.Add( "Task2",
        Task.Factory.StartNew( ( ) => {
          taskdict[ "Task1" ].Wait( );

         //Do stuff

        } ) );

      try {
        Task.WaitAll( taskdict.Values.Convert<Task[ ]>( ) );
      }

それとも、その 2 番目の Wait() / WaitAll() は失敗しますか?

4

1 に答える 1

24

タスクを 2 回待機することは間違いありません。負の副作用なしで、何度でもタスクを待機できます。同じスレッドで既にタスクを待機している場合は、既に完了しているため、Wait待機するものがないため、将来の呼び出しはすべてすぐに返されますが、失敗したり、不適切な結果を生成したりすることはありません。 .

例外がスローされた結果、タスクが正常に完了せず、代わりにキャンセルされたか、終了できなかった場合、 を呼び出すWaitと ( を呼び出すたびにWait) 例外が再スローされることに注意してください。が例外をスローしている場合Waitは、それが理由である可能性があります。

于 2013-04-24T15:29:18.457 に答える