私はUIアプリケーションを作成しています。例外が発生した場合は、アプリケーションを終了する前にいくつかの作業を行う必要があります。 私はAppDomain.CurrentDomain.UnhandledException
イベントを購読しました。UIスレッドからアプリケーション終了時に非同期タスクを待つ
AppDomain.CurrentDomain.UnhandledException += HandleException;
HandleException
方法は、(同期なしAPIが存在しないため)、リモートに保存する非同期(async)行います。
private void HandleException(object sender, UnhandledExceptionEventArgs args)
{
foreach (var user in UsersCollection.ToArray())
{
try
{
foreach (var session in user.Sessions.ToArray())
{
try
{
SaveSessionAsync(session).Wait();
}
catch (Exception e)
{
Logger.Error("Can't save session: " + session, e);
}
}
}
catch (Exception e)
{
Logger.Error("Can't save sessions of user " + user, e);
}
}
}
アプリケーションが終了する前に、私が(少なくとも試した)すべてのセッションを保存したことを確認する必要があります。しかし、私がWait()
を置くと、デッドロックが発生し、アプリケーションが停止することはありません。 私が知る限り、await
は、通常の状況で(私はUIスレッドではありますが、アプリケーションの終了状態ではない)助けてくれるかもしれませんが、await
はアプリケーションの終了を待っていません。だから私の節約の仕事は中止されるかもしれません。しかし、私はそれらを終了する必要があります。
デッドロックを作成せずにSaveSessionAsync
タスクの保証された終了を待つ方法はありますか?
ところで:SaveSessionAsyncは、あなただけが非async
方法でそれを実行する必要がある構文の一部を使用
をせずに良い[MCVE]確実に問題を再現すること、それは質問に対する良い答えがどうなるかを知ることは不可能です。しかし、一般的に言えば、 'UnhandledException'イベントはそれ自体例外処理のためのものではありません。ファイナライザと同様の役割を果たします。つまり、コードをバギーするバックストップです。あなたは 'try' /' catch'ブロックの中で非同期操作を待つべきで、例外は未処理です。そこで、あなたは 'catch'節でクリーンアップ作業を行うことができます。 –