バックグラウンドスレッドのSTA COMオブジェクトを使用しています。COMオブジェクトのモードがSTAであるため、STAスレッドモードの新しいスレッドからメソッドを呼び出すと、そのメソッドがブロックされます。UIスレッドもブロックされているようですが、このUIのブロックを回避できますか?STAスレッドモードスレッドは、winform UIスレッドもブロックしますか?
2
A
答えて
5
これはSTAのポイントです。COMは、ワーカースレッドからSTAスレッドへの呼び出しを自動的にマーシャリングします。そのため、COMサーバーメソッドは常にスレッドセーフな方法で呼び出されます。メソッドがブロックされると、STAスレッドもブロックされます。通常はUIスレッドです。
これは、このCOMオブジェクトをスレッドで使用すると、実際に何も達成されないことを意味します。実際の問題がCOMサーバーにあるという別の問題については、ブロックしてはいけません。これがデッドロック状態でないことを確認してください。
考えられる回避策は、少なくともあなたのUIスレッドがブロックされないように、別のSTAスレッドでCOMサーバーを作成することです。サンプルコードはthis answerをご確認ください。 Thread.SetApartmentStateとApplication.Runの両方の呼び出しは、サーバーの快適なホームを作成するために重要です。
関連する問題
- 1. Thread.JoinもUIスレッドで子スレッドをブロックしています
- 2. RxAndroidはUIスレッドをブロックします
- 3. Android AsyncTaskはUIスレッドをブロックします
- 4. 新しいスレッドはまだUIスレッドをブロックしています
- 5. AsyncTaskブロックUIスレッド
- 6. ダイアログボックスのSTAスレッド
- 7. スレッド:スレッドをブロックせずにUIを更新しますか?
- 8. Android bluetooth:UIスレッドから開始されたスレッドはUIスレッドをブロックします
- 9. ロードDLLブロックUIスレッド
- 10. wpfスレッド、スレッドはSTAである必要があります
- 11. タスク継続ブロックUIスレッド
- 12. SilverlightのブロックUIスレッドOnNavigatingFrom
- 13. iOS AVPlayer replaceCurrentItemWithPlayerItem:nilブロックUIスレッド
- 14. WPF別のSTAスレッドのレクリエーションウィンドウ
- 15. 非同期タスクまだブロックUIスレッド
- 16. API呼び出しブロックUIスレッドSwift
- 17. MsgWaitForMultipleObjectsExは、MFCアプリケーションのメインSTAスレッドをデッドロックします。
- 18. GoogleマップOnCameraChangeListenerジオコーダAsynTaskブロックUIスレッドは
- 19. UIは別のスレッドでもプロセスをフリーズしますか?
- 20. UIスレッドをブロックまたはスリープしないタイマーの説明
- 21. STA(シングルスレッド)
- 22. linqはスレッドをブロックしますか?
- 23. EclipseコンソールからUIスレッドをブロックしないようにする
- 24. ウィンドウ:同じスレッド(STA)上のグラフィックエレメント
- 25. UIスレッドは応答しますか?
- 26. Winformコントロールとスレッド
- 27. Winformとスレッド(C#)
- 28. Winform:複数のスレッド同時にUIを更新する
- 29. Java UIスレッドがブロックされました - メモリ不足エラー
- 30. UI.SubDialog()のようにUIスレッドをブロックする方法はありますか?WPF