5

TaskTPLを介して生成された非同期で実行される複雑な関数がいくつかありますが、予期しない方法で失敗することがあります。このような障害が発生した場合、これはプログラミングエラーを示しており、プログラムの状態が破損している可能性があります。したがって、プログラムで例外をキャッチして処理し、「リンプオン」したくないので、プロセスをクラッシュさせて終了させます。

また、Windowsエラー報告システムがクラッシュとして検出し、ミニダンプのキャッチやMicrosoftへの送信など、すべての便利なデバッグ処理を実行するように、この処理を終了させたいと考えています。

これは、エラー状態でプログラムが何をすべきかについてのあなたの意見に反するかもしれないことを私は理解していますが、問題はそれについてではありません。

私が抱えている問題は、例外がタスクから発生するため、プロセスがすぐにクラッシュすることはないということです。しばらくして、ガベージコレクターがその知恵で「監視されていない」例外を収集することを決定したときにクラッシュします。

プロセスをすぐにクラッシュさせたいのは...

  • 実際のエラーからのコールスタックとスレッドダンプは、クラッシュダンプで収集したいものです
  • プロセスが「足を引きずり」、後で不確定な時間にクラッシュすると、破損している可能性のあるプログラム状態で動作するため、さらに損傷を引き起こす可能性があります。
  • ユーザーは、どの操作が実際にクラッシュを引き起こしたのかについて混乱します

つまり、問題は次のとおりです。

TaskWindowsエラー報告が有用なミニダンプを作成できるように、TPLで作成された非同期からプロセスをクラッシュさせるにはどうすればよいですか?

前もって感謝します!

4

2 に答える 2

4

これ、または同様の何かを試すことができます:

public static Task FailFastOnException(this Task task) 
{ 
    task.ContinueWith(c => Environment.FailFast(“Task faulted”, c.Exception), 
        TaskContinuationOptions.OnlyOnFaulted | 
        TaskContinuationOptions.ExecuteSynchronously | 
        TaskContinuationOptions.DetachedFromParent); 
    return task; 
}

その後:

var t = Task.Factory.StartNew(…).FailFastOnException();

何らかの理由で失敗した場合にプロセスを停止したい「ファイアアンドフォーゲット」タスクでこれを頻繁に使用しました。

Stephen Toubによって書かれたブログ投稿からの抜粋:http: //blogs.msdn.com/b/pfxteam/archive/2009/05/31/9674669.aspx

于 2012-11-12T19:02:11.343 に答える
0

ThrowUnobservedTaskExceptionsapp.config設定)を見てください:

<configuration>   
    <runtime>   
        <ThrowUnobservedTaskExceptions enabled="true"/>   
    </runtime>   
</configuration>

タスクに関連付けられている例外が監視されていない場合、待機操作はなく、親は接続されておらず、System.Threading.Tasks.Task.Exceptionプロパティが読み取られなかった場合、タスクの例外は監視されていないと見なされます。

.NET Framework 4では、デフォルトで、監視されない例外があるタスクがガベージコレクションされると、ファイナライザーは例外をスローしてプロセスを終了します。プロセスの終了は、ガベージコレクションとファイナライズのタイミングによって決定されます。

開発者がタスクに基づいて非同期コードを記述しやすくするために、.NET Framework 4.5は、監視されない例外に対するこのデフォルトの動作を変更します。監視されていない例外により、UnobservedTaskExceptionイベントが発生しますが、デフォルトでは、プロセスは終了しません。代わりに、イベントハンドラーが例外を監視するかどうかに関係なく、イベントが発生した後は例外が無視されます。

.NET Framework 4.5では、アプリケーション構成ファイルの要素を使用して、.NETFramework4で例外をスローする動作を有効にすることができます。

次のいずれかの方法で例外の動作を指定することもできます。

  • 環境変数COMPlus_ThrowUnobservedTaskExceptionsを設定する(COMPlus_ThrowUnobservedTaskExceptions = 1を設定)。

  • HKEY_LOCAL_MACHINE \ SOFTWARE\Microsoft.NETFrameworkキーでレジストリDWORD値ThrowUnobservedTaskExceptions=1を設定する。

于 2017-09-12T15:25:42.887 に答える