長い時間がかかる呼び出しを待機する非同期イベントハンドラーがあるWPFダイアログがあるとします。次に、ユーザーは、待機が戻る前にダイアログを閉じます(そしてコードがダイアログを破棄します)。それがクラッシュを引き起こすと思います。.NET 4.5の新しいTaskAsyncメソッドでC#5の新しいasync / awaitキーワードを使用して、このシナリオを処理するための規定された方法はありますか?
2 に答える
async
/await
正常に動作するはずです。
SynchronizationContext
各WPFウィンドウは、少なくとも現時点では独自のウィンドウを作成します(これは実装の詳細です)。しかし、これらは一般的なの単なる単純なラッパーDispatcher
です。
したがって、破壊されたウィンドウのをTaskAwaiter
キャプチャすることになりますが、はまだそこにあるSynchronizationContext
ため、実際には問題ではありません。Dispatcher
さて、あなたのコードがすることは別の話です。たとえば、async
この状況でイベントハンドラーがある場合、破棄されたインスタンスでの再開を処理できる必要があります。
Adamとleppieの両方に良いコメントがあります。ユーザーがダイアログを閉じるのを防ぐか、タスクをキャンセルします(そして、実際にダイアログを閉じる前に、タスクがキャンセルされていることを確認してください)。もう1つの良いオプションは、ダイアログよりも長持ちする操作を開始することである場合、を開始してTask
から、進行中の操作の共有コレクションに追加することです。これらのオプションはすべて、破棄async
されたインスタンスで実行されているイベントハンドラーの望ましくない状況を防ぎます。
これは正確な状況によると思います。async
dオブジェクトのメソッドにコードがある場合、フレームワークには何の意味もないDispose()
ので、問題なく続行できます。Dispose()
もちろん、メソッドがスローするメソッドObjectDisposedException
(またはその他の例外)を呼び出すと、非同期操作が停止します(例外をキャッチしない限り)。しかし、それは自動的には起こりません。