http://www.atmarkit.co.jp/ait/articles/1512/16/news026.html
↑の解説によれば、
バックグラウンドタスクの完了を待機しない場合には、次のように仕様が変わっている。
.NET 4.0: トラップされなかった場合は、プログラムが終了する
.NET 4.5: トラップされなかった場合は、その例外は失われる(既定値)
この.NET 4.5の動作は、.NET 4.0と同じ動作をするように変更できる。本稿では、.NET 4.0と同じ動作に変更しておく。
それには環境変数やレジストリを設定する方法もあるが、ここでは動作環境によらずアプリごとに設定する方法を用いる。
.NET 4.5のプロジェクトの場合は、App.configファイルでThrowUnobservedTaskExceptionsをtrueに設定しておいてもらいたい(次のコード)。
とあります。実際、この解説には間違いがなく、言われたとおりに設定すれば、4.0の動きに戻りました。
なので、動きそのものについては、そうなっていることが確かめられたのですが、なぜ仕様変更されたのかの理由が分かりません。
仕様変更の理由についてご存知の方がいらっしゃれば教えてください。
特に、
<runtime> <ThrowUnobservedTaskExceptions enabled="true"/> </runtime>
と設定してはいけない、または、推奨されない理由があれば、そのような理由を教えていただければと思います。
タスクに基づく非同期コードを記述する開発者向け容易にできるように、
.NET Framework 4.5観察されない例外のこの既定の動作を変更します。
無視された例外が、UnobservedTaskExceptionイベントが発生する、
既定では、プロセスを終了しません。
代わりに、イベント ハンドラーが例外を監視するかどうかに関係なく、
イベントが発生した後に、例外が無視されます。
とあります。しかし、想定していない例外が発生した場合、プロセスを停止しない理由が分かりません。
開発しているアプリケーションはクライアントアプリであり、サーバーなどではないため、常時起動が求められているわけでもありません。
想定外の例外が発生した場合は、ログ出力とエラーメッセージ表示を行いプロセスを終了して、ログとエラーメッセージから、
原因を追及すべきと考えています。
私の考えは間違っているのでしょうか?
なぜ、例外の仕様が変更されたのか教えてください。
そして、繰り返しになりますが、上の設定が非推奨または禁止であれば、それを教えて下さい。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/23 05:43
2018/03/23 05:51