2

長い時間がかかる呼び出しを待機する非同期イベントハンドラーがあるWPFダイアログがあるとします。次に、ユーザーは、待機が戻る前にダイアログを閉じます(そしてコードがダイアログを破棄します)。それがクラッシュを引き起こすと思います。.NET 4.5の新しいTaskAsyncメソッドでC#5の新しいasync / awaitキーワードを使用して、このシナリオを処理するための規定された方法はありますか?

4

2 に答える 2

1

async/await正常に動作するはずです。

SynchronizationContext各WPFウィンドウは、少なくとも現時点では独自のウィンドウを作成します(これは実装の詳細です)。しかし、これらは一般的なの単なる単純なラッパーDispatcherです。

したがって、破壊されたウィンドウのをTaskAwaiterキャプチャすることになりますが、はまだそこにあるSynchronizationContextため、実際には問題ではありません。Dispatcher

さて、あなたのコードがすることは別の話です。たとえば、asyncこの状況でイベントハンドラーがある場合、破棄されたインスタンスでの再開を処理できる必要があります。

Adamとleppieの両方に良いコメントがあります。ユーザーがダイアログを閉じるのを防ぐか、タスクをキャンセルします(そして、実際にダイアログを閉じる前に、タスクがキャンセルされていることを確認してください)。もう1つの良いオプションは、ダイアログよりも長持ちする操作を開始することである場合、を開始しTaskから、進行中の操作の共有コレクションに追加することです。これらのオプションはすべて、破棄asyncされたインスタンスで実行されているイベントハンドラーの望ましくない状況を防ぎます。

于 2012-07-25T15:20:23.490 に答える
1

これは正確な状況によると思います。asyncdオブジェクトのメソッドにコードがある場合、フレームワークには何の意味もないDispose()ので、問題なく続行できます。Dispose()もちろん、メソッドがスローするメソッドObjectDisposedException(またはその他の例外)を呼び出すと、非同期操作が停止します(例外をキャッチしない限り)。しかし、それは自動的には起こりません。

于 2012-07-25T09:04:07.413 に答える