2011-01-12 9 views
9

C#4.0 Task.Factory.StartNewを使用して見たドキュメントのほとんどは、タスクの完了を待つために待機が必要です。しかし、私の最初のテストは、それが不必要であることを示しています。誰かが私にこれを確認することはできますか?私はなぜそんなにオンラインと印刷された参照があなたに待つ必要があると言うのは好奇心です。Task.Factory.StartNew()を使用した後にWait()が必要ですか?

ここには私がWaitステートメントが必要ないことを示す簡単なコンソールアプリケーションがありますので、コメントアウトしました。私がtsk.Wait()をコメントアウトするかどうかにかかわらず、出力は同じです。次のようにすべてのケースで

期待出力は次のとおりです。

 
Main thread starting. 
After running MyTask. The result is True 
After running SumIt. The result is 1 
Main thread ending. 

コード:

class Program 
{ 
    // A trivial method that returns a result and takes no arguments. 
    static bool MyTask() 
    { 
     Thread.Sleep(2000); 
     return true; 
    } 

    // This method returns the summation of a positive integer 
    // which is passed to it. 
    static int SumIt(object v) 
    { 
     int x = (int)v; 
     int sum = 0; 
     for (; x > 0; x--) 
      sum += x; 
     return sum; 
    } 

    static void Main(string[] args) 
    { 
     Console.WriteLine("Main thread starting."); 
     // Construct the first task. 
     Task<bool> tsk = Task<bool>.Factory.StartNew(() => MyTask()); 
     // I found this Wait statement to be completely unnecessary. 
     //tsk.Wait(); 
     Console.WriteLine("After running MyTask. The result is " + 
     tsk.Result); 
     // Construct the second task. 
     Task<int> tsk2 = Task<int>.Factory.StartNew(() => SumIt(1)); 
     Console.WriteLine("After running SumIt. The result is " + 
     tsk2.Result); 
     tsk.Dispose(); 
     tsk2.Dispose(); 
     Console.WriteLine("Main thread ending."); 
     Console.ReadLine(); 
    } 
} 

答えて

19

タスクが完了するのを待つだけの場合は、.Wait()を呼び出すことをおすすめします。 TaskTask<T>ではなく)の場合、これが唯一のオプションです。 Task<T>については

は、しかし、また.Result待ちがあり、それはあなたが使用しているものです。したがって、あなたの場合、.Wait()に電話する必要はありません。

+0

ありがとう、Timwi。私は脳のおならがあり、Taskの代わりにTask を使用していることに気付かなかった。今それは意味をなさない! –

+0

@ tambui:答えとしてマークするのはどうですか? – stackoverflowuser

+0

@stackoverflowuser:申し訳ありませんが、方法を知らなかった。完了しました。 –

1

thisに応じて以来、TaskValueにアクセスすると」、タスクが完了していることを保証しますそれは必須ではないことを正しく示しています。

+0

これは正しいです。ありがとう、ジェイコブ!私の間違いは、タスクの代わりにタスクを使用していたことを忘れていました。 –

1

Timwiが述べたように、結果も待っています。 Console.WriteLineコールでtsk.Resultを使用しているので、待機を副作用として実行しています。

タスクが完了するまでの時間によっても異なります。それが非常に短い場合、あなたは時間がたつにつれていつも終わると思われるので、あなたは.Waitの必要性を認識しないかもしれません。続行する前にタスクを完了する必要がある場合は、退出する危険性があります。したがって、時間の99%が使用されても、実際には待機する必要はありません。

2

Waitの重要な機能の1つは、Taskによってスローされた例外がこの時点で再スローされる点でランデブーポイントとして機能することです。現在のTask実装では、そのような例外を観察するように強制されていますWaitはそうするのに適しています。ただし、例外のためにTaskインスタンスを照会することによって例外を観察することもできます。

*)明らかにこれが変更されます。動作は非同期CTPで変更されます。

関連する問題