1

例外をスローするタスクがある場合、例外があったかどうか継続をチェックインできます。

Task task1 = Task.Factory.StartNew (() => { throw null; });
Task task2 = task1.ContinueWith (ant => Console.Write (ant.Exception));

しかし、私もそれを知っています:

先行詞がスローされ、継続が先行詞のExceptionプロパティのクエリに 失敗した場合(および先行詞が待機されていない場合)、例外は未処理と見なされ、アプリケーションは停止します。

だから私は試しました:

Task task1 = Task.Factory.StartNew (() => { throw null; });
Task task2 = task1.ContinueWith (ant => Console.Write (1));//1

しかし、アプリケーションはクラッシュしませんでした。

お願い、何が足りないの?

4

1 に答える 1

5

起こっているいくつかの異なることがあります:

まず、Wait()faultedを呼び出すと、すでにTaskそれを観察したかどうかに関係なく、常に例外がスローされます。コードでは、これは、task.Wait()から呼び出すとMain()、で未処理の例外があるため、アプリケーション全体がクラッシュすることを意味しますMain()

次に、.Net 4.5で未処理の例外の動作がTask変更され、アプリケーションがクラッシュすることはなくなりました。この記事では、元の動作に戻す方法についても説明しています。また、.Net 4.5がインストールされている場合、これは.Net 4.0を対象とするアプリケーション(VS 2010を使用して構築されたアプリケーションなど)にも適用されます。

第3に、.net 4.0の動作では、ガベージコレクションが行われるとアプリケーションがクラッシュTaskます(その時点までに例外が観察されなかったと仮定します)。これは、その前に、コードがその例外を監視する可能性がまだあるためです。

したがって、次のコードはアプリケーションをクラッシュさせます(.Net4.5がインストールされている場合に.Net4.0の動作を有効にしたと仮定します)。

static void Main()
{
    Task.Factory.StartNew(() => { throw new Exception(); });

    // give the Task some time to run
    Thread.Sleep(100);

    GC.Collect();
}

アプリケーションが正常に終了する前にGCを実行する機会がなかったため、コードはクラッシュしませんでした。

于 2013-02-23T17:30:23.573 に答える