1

我正在编写一个插件(dll 文件),并且正在创建一个 WinForm 作为其界面/对话框。如果确实需要消息泵,我应该如何以及在哪里创建一个?

4

3 回答 3

2

SpeechRecognitionEngine 是一个单元线程 COM 服务器的包装器。是的,对它们的硬性要求是至少有一个线程是 STA 并泵送消息循环。由于您正在编写库,因此您无法控制客户选择的内容。但是您可以告诉她存在问题,而不仅仅是让您的语音识别器陷入僵局。将此检查添加到您的类构造函数中:

  if (System.Threading.Thread.CurrentThread.GetApartmentState() !=
      System.Threading.ApartmentState.STA) {
    throw new InvalidOperationException("UI thread required");
  }

检查有点繁琐,如果识别器是在一个也有 UI 线程的程序中的工作线程上创建的,它仍然可以工作。尽管这种模式非常不受欢迎,但对识别器的每次调用都会被封送,并且您生成的任何事件都必须由客户端进行封送。我会向您的主类构造函数建议一个参数,该参数允许客户端表明她确实希望识别器在线程上运行。

于 2010-04-12T17:00:07.580 回答
1

您不必创建一个,WinForm 应用程序有一个。

于 2010-04-12T16:38:56.920 回答
0

如果您以通常的方式创建 Winforms 应用程序,它将创建自己的消息泵。这就是你所需要的。

于 2010-04-12T16:38:36.237 回答