【发布时间】:2010-04-12 16:36:22
【问题描述】:
我正在编写一个插件(dll 文件),并且正在创建一个 WinForm 作为其界面/对话框。 如果确实需要消息泵,我应该如何以及在哪里创建一个?
【问题讨论】:
标签: .net winforms dll speech-recognition message-pump
我正在编写一个插件(dll 文件),并且正在创建一个 WinForm 作为其界面/对话框。 如果确实需要消息泵,我应该如何以及在哪里创建一个?
【问题讨论】:
标签: .net winforms dll speech-recognition message-pump
SpeechRecognitionEngine 是一个单元线程 COM 服务器的包装器。是的,对它们的硬性要求是至少有一个线程是 STA 并泵送消息循环。由于您正在编写库,因此您无法控制客户选择的内容。但是您可以告诉她存在问题,而不仅仅是让您的语音识别器陷入僵局。将此检查添加到您的类构造函数中:
if (System.Threading.Thread.CurrentThread.GetApartmentState() !=
System.Threading.ApartmentState.STA) {
throw new InvalidOperationException("UI thread required");
}
检查有点过分,如果识别器是在一个也有 UI 线程的程序中的工作线程上创建的,它仍然可以工作。尽管这种模式非常不受欢迎,但对识别器的每次调用都会被封送,并且您生成的任何事件都必须由客户端进行封送。我会向您的主类构造函数建议一个参数,允许客户端表明她确实确实希望识别器在线程上运行。
【讨论】:
您不必创建一个,WinForm 应用程序有一个。
【讨论】:
如果您以通常的方式创建 Winforms 应用程序,它将创建自己的消息泵。这就是你所需要的。
【讨论】: