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

Note

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

Microsoft UI オートメーションの Windows メッセージを使用する方法が原因で、クライアント アプリケーションが UI スレッド上のそれ自体の UI とやりとりしようとするときに、競合が発生する場合があります。 これらの競合が発生すると、パフォーマンスが著しく低下する恐れがあります。また、アプリケーションが応答を停止する可能性もあります。

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

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