我正在编写一个插件(dll文件),我正在创建一个WinForm作为其界面/对话框。 如果它确实需要一个消息泵,我应该如何以及在哪里创建一个?
答案 0 :(得分:2)
SpeechRecognitionEngine是一个公寓线程COM服务器的包装器。是的,对它们的一个硬性要求是至少有一个线程是STA并且泵送消息循环。由于您正在编写库,因此无法控制客户端选择的内容。但你可以告诉她,有一个问题,而不仅仅是你的语音识别器死锁。将此检查添加到类构造函数中:
if (System.Threading.Thread.CurrentThread.GetApartmentState() !=
System.Threading.ApartmentState.STA) {
throw new InvalidOperationException("UI thread required");
}
检查有点笨拙,如果在具有UI线程的程序中的工作线程上创建识别器,则识别器仍然可以工作。尽管该模式非常不合需要,但是对识别器的每次调用都将被编组,并且您生成的任何事件都必须由客户端进行封送。我建议你的主类构造函数的一个参数允许客户端指示她真的 希望识别器在一个线程上运行。
答案 1 :(得分:1)
您不必创建一个,WinForm应用程序有一个。
答案 2 :(得分:0)
如果您以通常的方式创建Winforms应用程序,它将创建自己的消息泵。这就是你应该需要的一切。