UI オートメーション スレッド処理の問題点

メモメモ

このドキュメントは、System.Windows.Automation 名前空間で定義されているマネージ UI Automation クラスを使用する .NET Framework 開発者を対象としています。UI Automationに関する最新情報については、「Windows Automation API: UI Automation (Windows オートメーション API: UI オートメーション)」を参照してください。

クライアント アプリケーションが UI スレッドで独自の UI と対話しようとしたときに、Microsoft UI Automationが Windows メッセージを使用する方法に起因して競合が発生する場合があります。 こうした競合が生じると、パフォーマンスが著しく低下したり、アプリケーションが応答しなくなる場合があります。

クライアント アプリケーションが、独自の UI を含め、デスクトップ上のすべての要素と対話する場合は、すべての UI Automationの呼び出しを個別のスレッドで行う必要があります。 これには、要素の検索 (たとえば、TreeWalker または FindAll メソッドを使用) やコントロール パターンの使用が含まれます。

UI Automation イベント ハンドラーは常に非 UI スレッドで呼び出されるため、このイベント ハンドラー内での UI Automationの呼び出しは安全に行うことができます。 ただし、クライアント アプリケーションの UI から発生する可能性があるイベントをサブスクライブする場合は、AddAutomationEventHandler または関連メソッドを非 UI スレッドで呼び出す必要があります。 同じスレッド上のイベント ハンドラーは削除します。