私はプラグイン (dll ファイル) を作成しており、そのインターフェイス/ダイアログとして WinForm を作成しています。メッセージ ポンプが必要な場合、どこでどのように作成すればよいですか?
3 に答える
SpeechRecognitionEngineは、アパートメントスレッドのCOMサーバーのラッパーです。はい、それらの厳しい要件は、STAであり、メッセージループをポンプする少なくとも1つのスレッドです。ライブラリを作成しているため、クライアントが何を選択するかを制御することはできません。しかし、音声認識機能がデッドロックするだけでなく、問題があることを彼女に伝えることができます。このチェックをクラスコンストラクターに追加します。
if (System.Threading.Thread.CurrentThread.GetApartmentState() !=
System.Threading.ApartmentState.STA) {
throw new InvalidOperationException("UI thread required");
}
チェックは少し手間がかかります。UIスレッドもあるプログラムのワーカースレッドで作成された場合でも、レコグナイザーは機能します。このモードは非常に望ましくありませんが、レコグナイザーへのすべての呼び出しがマーシャリングされ、生成するイベントはすべてクライアントによってマーシャリングされる必要があります。メインクラスのコンストラクターに引数を付けて、クライアントがレコグナイザーをスレッドで実行することを本当に望んでいることを示すことができるようにすることをお勧めします。
作成する必要はありません。WinForm アプリケーションには作成されています。
通常の方法で Winforms アプリケーションを作成している場合、独自のメッセージ ポンプが作成されます。それだけで十分です。