2017-04-21 12 views
0

いつでも、私のWPFアプリケーションには、バックグラウンドスレッド/同期コンテキストで実行されている非同期の束があります。Taskシャットダウン時に、CancellationTokenを設定してから、これらのタスクが正常に完了するのを待ってから、依存するネイティブライブラリを解体することができます。しかし、タスクの中には、メインスレッドで実行する必要があるため、同じスレッドからTask.WaitAll(_myTasks)を呼び出すと、デッドロックが発生することがあります。デッドロックなしでシャットダウン時にタスクが完了するのを待ちます

while(!AreAllTasksComplete(_myTasks)) 
    LetContinuationsThatAreWaitingForThisContextRun(); 
TearDownTheNativeLibraries(); 

しかし、もちろんのLetContinuationsThatAreWaitingForThisContextRun()が存在しません:私は何をしたいのですが、このようなものです。私がやろうとしていることをする方法はありますか?全く異なるアプローチが必要ですか?

+1

何ができるのでしょうか?おそらく何か待っている... – DarkSquirrel42

+0

それはしばらくの間、私は仕事で多くをしなければならなかったが、あなたはTask.WhenAllを見たいかもしれません。この質問は、その使い方についてもう少し説明しています.http://stackoverflow.com/questions/22699048/why-does-task-waitall-not-block-or-cause-a-deadlock-here – Hack

+0

これはWPFアプリケーションなのでDisputcher.CurrentDispatcher.Invoke(()=> {}、DispatcherProperity.Background')のように 'LetContinuationsThatAreWaitingForThisContextRun()'を実装することができます。これは(一見)うまくいくが、おそらく文書化されていない動作に依存している。 – dlf

答えて

0

あなたはあなたのメインスレッドがmessageloopに戻すことができますが、あなたの仕事を見て、別のバックグラウンドスレッドについて

await Task.WhenAll(_myTasks); 
TearDownTheNativeLibraries(); 
+0

このようなものは私の最初の考えでしたが、TearDownTheNativeLibraries()を実行した後で終了するまで、アプリが終了しないようにする必要があります。さもなければ、私が待っている間、shudownプロセスは続行し、アプリケーションは終了し、TearDownTheNativeLibraries()は決して起こらず、管理するファイルは不整合な状態になる可能性があります。私はこのようなことをしてしまうかもしれませんが、リファクタリングが必要です。 – dlf

+0

これは、(a)どのようなイベントがシャットダウンをトリガするか(たとえばボタンクリック)、(b)システムを終了させる方法(メインウィンドウのCloseなど)に依存します。 – dvorn

関連する問題