我如何“终止”无效方法?

时间:2018-08-14 22:17:03

标签: c# speech-recognition

我有一个void方法(希望我正确地说了),该方法初始化语音识别引擎,语法和文本文件的一些路径,以从中获取命令。现在,我将代码放入了void方法中,以便可以在From_Load事件中调用它,但是由于某些原因,如果PC进入睡眠状态然后备份,语音识别将无法正常工作,因此我设置了一个计时器来调用每十分钟一次。现在,语音Recog和语法每10分钟重新初始化一次,但不确定是否将其初始化两次,或者第一个自动终止,如果没有,是否可以执行?

  public void InitGrammar()
    {
        #region Recengine, grammar, commands
        try
        {

            SpeechRecognitionEngine recEngine = new SpeechRecognitionEngine();
            //Grammar DGrammar = new DictationGrammar();
            //recEngine.LoadGrammar(DGrammar);


            Choices commands = new Choices();
            Choices Ecommands = new Choices();
            Ecommands.Add(new string[] { "Emergency shutdown", "Reboot", "Abort", "Abort Abort" });
            commands.Add(File.ReadAllLines(@"C:\Natalie\commands\commands.txt"));
            GrammarBuilder gBuilder = new GrammarBuilder();
            gBuilder.Append(commands);
            Grammar grammar = new Grammar(gBuilder);
            synthesizer.SelectVoiceByHints(VoiceGender.Female);

            recEngine.LoadGrammarAsync(grammar);
            recEngine.SetInputToDefaultAudioDevice();

            recEngine.SpeechRecognized += RecEngine_SpeechRecognized;
            recEngine.RecognizeAsync(RecognizeMode.Multiple);


        }
        catch (Exception exinit)
        {
            _Errorsound.Play();
            MessageBox.Show(exinit.Message);

        }

        synthesizer.SelectVoiceByHints(VoiceGender.Female);

        #endregion
    }

1 个答案:

答案 0 :(得分:3)

由于措辞,这里有些混乱。 原始方法调用几乎可以肯定在毫秒内完成,因此当您的计时器过去时,方法已经“终止”。您的代码中没有任何内容表明它正在阻止(事件注册和“ Recognize 异步”特别提示)

该方法的副作用可能仍然存在(在这种情况下肯定会发生)。在重新运行初始化例程之前,您必须通过手动处置/注销等方法来解决此问题。

从概念上理解这一点非常重要,但是@Heretic Monkey总体上为您的解决方案提供了一个很好的观点:

  

您确实应该在Windows API中添加一些挂钩,并在计算机唤醒时重新初始化。否则,您将在玩猜谜游戏。