.NET BackgroundWorkerスレッドからアンマネージコードの呼び出しがUIに影響するのはなぜですか?
-
08-07-2019 - |
質問
.NET 2.0 BackgroundWorker
スレッドで長時間実行される一連の操作があります。参照アセンブリにあるアンマネージコードを呼び出すと、呼び出しが完了するまでUIがフリーズします。
これはなぜですか? BackgroundWorker
スレッドからこれらの呼び出しを行うべきではありませんか?
はい、それはCOMコンポーネントですが、STAであるかどうか、およびその意味/解決策が何であるかをどのように判断するかわかりません。私はそのコンポーネントに対していくつかの呼び出しを行いますが、UIが応答しなくなったことに気づくのは実行時間の長いものだけです。
これらの呼び出しは、サーバーからデータを取得します。
解決
質問にCOMタグがあります-COMコンポーネントを呼び出していますか? STAコンポーネントですか?その場合、何らかの方法でUIスレッド上で作業を行うためにマーシャリングバックされる可能性があります。私はCOMの専門家になるのはまだまだ遠いことを認めますが、それが問題であったとしても驚かないでしょう。
明示的に作成した新しいスレッドから呼び出しを行うとどうなりますか?
他のヒント
はい、また、これはすべてのアンマネージコードまたは特定のコンポーネントまたはAPIで発生しますか?特定の場合、そのアンマネージコードは何をしていますか?
また、BackgroundWorkerで現在のコードをコメントアウトして(RunWorkerAsyncを正しく実行しています...)、そこにスリープ状態にすることもできます。 GUIが応答しなくなった場合、何かが正しくない場合、Jonが指摘しているように呼び出しているコードがCOMの場合があります。