1

Wait()次のサンプルで、または次のサンプルの行のコメントを外すと、startNew.ResultがキャッチされますAggregateException。これらのコード行にコメントが付いていると、例外が表示されないのはなぜですか?

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Task<int> startNew = Task.Factory.StartNew(() => int.Parse(""), 
                                             TaskCreationOptions.LongRunning);
            //int result = startNew.Result;
            //startNew.Wait();
            Thread.Sleep(10000);             
        }
        catch (AggregateException ex)
        {
            Console.WriteLine("Catched in aggregated");
        }
        catch (Exception)
        {
            Console.WriteLine("Catched in general");
        }

        Console.WriteLine("The end");
        Console.ReadLine();
    }
}
4

2 に答える 2

2

しかし、これらのコード行がコメント化されていると、なぜ例外が表示されないのでしょうか。

何も投げていないからです!あるスレッドからの例外が、それを引き起こすために何もしなくても、任意のポイントで別のスレッドにスローされることは本当に望ましくありません。

は例外をTask<> 記憶Wait()していますが、これまで見てきたように、またはなどの操作を具体的に実行しない限り、例外はスローさResultれません。

を使用してエラーを確認することもできますTask.Exception

于 2012-12-18T12:02:46.397 に答える
0

ジョンスキートは正しいですが、彼の答えは完全ではありません。

Wait()またはResultを呼び出さない場合は、FinalizeメソッドがTaskオブジェクトで呼び出され、その呼び出しが例外の内部タスクオブジェクトコレクション内の例外の存在をチェックしてから、 UnobservedTaskExceptionは、アプリケーションの即時クラッシュにつながります(TaskScheduler.UnobservedTaskExceptionのコールバックを登録しない限り、強くお勧めしません)。

于 2012-12-19T10:18:25.700 に答える