6

私の理解では、タスクが例外をスローすると、タスクの (Result、WaitAll) プロパティのいずれかが観察されるか、GC が発生したときに、例外が保存されて再スローされます。それを考慮して、次のコードを実行します。

Task t = Task.Factory.StartNew(() =>
{                    
    throw new Exception("Hello World");
});

for (int i = 0; i < 10000; i++)
{
    Console.WriteLine(i);
}    

 GC.Collect();

 for (int a = 20; a < 30; a++)
 {
      Console.WriteLine(a);
 }

しかし、上記のコードを実行すると、GC.Collect で例外がスローされることはありませんが、例外は発生せず、2 番目のループから出力を出力し続けます。ここで私の理解はどこが間違っていますか?

4

2 に答える 2

5

サンプルコードでは、Taskオブジェクトtはまだスコープ内にあるため、を呼び出したときに収集の対象にはなりませんGC.Collect()

それとは別に、動作は.NET4.0と.NET4.5の間で変更されました。

.NET 4.0では、監視されない例外がファイナライザスレッドで例外をスローし、プロセスがクラッシュします。

.NET 4.5では、この動作が変更されたため、監視されない例外はデフォルトで無視されます。古い厳密な動作をオンに戻すために設定できる構成スイッチがあります。

.NET 4.0:タスクと未処理の例外

.NET 4.5:.NET4.5でのタスク例外処理

于 2012-10-14T16:03:00.213 に答える
0

タスクを使用することは、(メインスレッド以外に) 個別に実行されるスレッドを使用するようなものであるためです。したがって、このようにして、タスクによって例外行が実行されるまで実行されるGC.Collectとともにループ出力を取得できます。

于 2012-10-14T15:51:43.037 に答える