【问题标题】:Does Speech Recognition using .NET Framework require a message pump?使用 .NET Framework 进行语音识别是否需要消息泵?
【发布时间】:2010-04-12 16:36:22
【问题描述】:

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

【问题讨论】:

    标签: .net winforms dll speech-recognition message-pump


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-14
          • 1970-01-01
          • 1970-01-01
          • 2018-01-27
          • 2019-05-05
          • 2018-10-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多