いつでも、私のWPFアプリケーションには、バックグラウンドスレッド/同期コンテキストで実行されている非同期の束があります。Task
シャットダウン時に、CancellationToken
を設定してから、これらのタスクが正常に完了するのを待ってから、依存するネイティブライブラリを解体することができます。しかし、タスクの中には、メインスレッドで実行する必要があるため、同じスレッドからTask.WaitAll(_myTasks)
を呼び出すと、デッドロックが発生することがあります。デッドロックなしでシャットダウン時にタスクが完了するのを待ちます
while(!AreAllTasksComplete(_myTasks))
LetContinuationsThatAreWaitingForThisContextRun();
TearDownTheNativeLibraries();
しかし、もちろんのLetContinuationsThatAreWaitingForThisContextRun()が存在しません:私は何をしたいのですが、このようなものです。私がやろうとしていることをする方法はありますか?全く異なるアプローチが必要ですか?
何ができるのでしょうか?おそらく何か待っている... – DarkSquirrel42
それはしばらくの間、私は仕事で多くをしなければならなかったが、あなたはTask.WhenAllを見たいかもしれません。この質問は、その使い方についてもう少し説明しています.http://stackoverflow.com/questions/22699048/why-does-task-waitall-not-block-or-cause-a-deadlock-here – Hack
これはWPFアプリケーションなのでDisputcher.CurrentDispatcher.Invoke(()=> {}、DispatcherProperity.Background')のように 'LetContinuationsThatAreWaitingForThisContextRun()'を実装することができます。これは(一見)うまくいくが、おそらく文書化されていない動作に依存している。 – dlf