5

私は静かに飲み込まれた例外の大ファンではありませんが、次のコードはまさにそれを行います:

Task.Run(() =>
{
    var obj = DoSomethingCpuIntensive(); // returns null, due to a bug
    obj.DoMoreStuff();
    Console.WriteLine("after"); // never get here; program continues running
});

ThrowUnobservedTaskExceptions構成値について読みましたが、返されたもので何もしないため、これは役に立ちませんTask(編集: 実際には役に立ちますが、リリース ビルドでのみ)。

その未処理の例外でプログラムをクラッシュさせる方法はありますか? Task.Run私は想定されていない方法で使用していますか?

4

3 に答える 3

2

Task.Run以上の使用を強くお勧めしますThreadPool.QueueUserWorkItem

まず、一歩下がってください。の目的はDoSomethingCpuIntensive何ですか? 何らかの値を計算している場合は、それを返すことをお勧めしTask<T>ますTaskDoMoreStuff例 ( CPU を集中的に使用しないと仮定):

async Task DoWorkAsync()
{
  var obj = await Task.Run(() => DoSomethingCpuIntensive());
  obj.DoMoreStuff();
}

私が理解しようとしているのは、「結果」が単に「成功」​​または「例外」であっても、コードはバックグラウンド操作の結果を気にする必要があるということです。あなたのコードはそのようにきれいです。それ以外の場合は、アプリケーションの状態の変化を検出することによってのみ対応できる、半独立したシステムになります。はるかに面倒です。

そうは言っても、本当に半独立したシステムが必要で、プロセスが失敗した場合にプロセスをクラッシュさせたい場合は、ThrowUnobservedTaskExceptionsまさにそれが必要です。役に立たないと思う理由がわかりません。

于 2013-04-25T12:44:07.710 に答える
0

あなたは について読んだと言いますThrowUnobservedTaskExceptionsThrowUnobservedTaskExceptions実際に設定で設定してプログラムを実行してみtrueましたか?

.NET 4 の既定の動作では、監視されていないTask例外によってプロセス全体がダウンします。

.NET 4.5 の既定の動作では、監視されていないTask例外によってプロセスがダウンすることはありません。.NET 4.5 で実行しているため、に設定ThrowUnobservedTaskExceptionsすると、true必要なことが正確に実行されます。

于 2013-04-25T12:42:30.370 に答える