2

いくつかのタスクによって呼び出される関数ブロックを囲む try catch を使用することと、task.wait() で try/catch を呼び出すことの違いは何ですか。関数内で例外を処理する場合でも、 task.wait() から発生する可能性のある例外について心配する必要はありますか?

var factory = new TaskFactory();
task t1= factory.StartNew(() => funA();
t1.Wait();


void funcA()
{
  try{..}
  .
  .
  catch{..}
}

または

var factory = new TaskFactory();
task t1= factory.StartNew(() => funA();
try
{
  t1.Wait();
}
catch{....}

void funcA()
{

}
4

2 に答える 2

1

あなたが提供した最初のブロックでは、発生する可能性のあるこれらの例外をキャッチすることはできません:

  • ObjectDisposedException: タスクは破棄されました。

  • ArgumentOutOfRangeException: timeout が -1 ミリ秒以外の負の数で、無限のタイムアウトを表します。または、timeout が MaxValue を超えています。

  • AggregateException: タスクがキャンセルされました。または、タスクの実行中に例外がスローされました。

MSDN のドキュメントからTask.Wait()

于 2012-08-14T11:17:42.953 に答える
0

私は、継続を伴うタスクで例外を処理するために使用します。IMO は簡単です。

Task myTask= Task.Factory.StartNew( ... ).ContinueWith(myTaskFinished=> 
{
   if (myTaskFinished.IsCompleted)
   {
       // Hooray
   }

   if (myTaskFinished.IsFaulted)
   {
       foreach (Exception ex in myTaskFinished.Exception.InnerExceptions)
           //Exception handle..
   }

   if(myTaskFinished.IsCanceled)
   { 
        //Cancellation token?
   }
});

myTask.Wait();
于 2012-08-14T15:17:03.263 に答える