[解決済み] タスクの例外は、タスクの待ち時間やExceptionプロパティへのアクセスでは観測されませんでした。その結果、観測されなかった例外は
2022-12-05 17:52:18
質問
これは何を意味し、どのように解決すればよいのでしょうか。
TPLタスクを使っています。
エラーの全体像
あるタスクの例外が、そのタスクの待ち時間やExceptionプロパティへのアクセスによって観測されませんでした。その結果、観測されなかった例外はファイナライザースレッドによって再スローされました。
at System.Threading.Tasks.TaskExceptionHolder.Finalize()
mscorlib
どのように解決するのですか?
タスクを作成した後、一度も
task.Wait()
を呼び出したり、その結果を取得したりすることはありません。
Task<T>
を実行すると、タスクがガベージコレクタに回収されるときに、 アプリケーションを最終的に破棄することになります。 詳しくは、MSDN の
TPL における例外処理
.
ここでの最良の選択肢は、例外を "handle"することです。 タスクに継続をアタッチし、発生した例外をログに記録したり、飲み込んだりすることができます。 これは、タスクの例外を記録するきれいな方法を提供し、単純な拡張メソッドとして記述することができます。
public static void LogExceptions(this Task task)
{
task.ContinueWith( t =>
{
var aggException = t.Exception.Flatten();
foreach(var exception in aggException.InnerExceptions)
LogException(exception);
},
TaskContinuationOptions.OnlyOnFaulted);
}
以上により、任意のタスクがアプリをティアリングダウンするのを防ぎ、それをログに記録することができます。
Task.Factory.StartNew( () =>
{
// Do your work...
}).LogExceptions();
別の方法として TaskScheduler.UnobservedTaskExceptionを購読することもできます。 をサブスクライブして、そこで処理することもできます。
関連
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。