我怎样才能“终止”一个无效的方法?

我有一个 void 方法(希望我说得对),它初始化语音识别引擎、语法和一些用于获取命令的文本文件的路径。现在我已经将代码放在一个 void 方法中,以便我可以在 From_Load 事件中调用它,但是由于某种原因,如果 PC 进入睡眠状态然后再备份,语音识别将不起作用,我设置了一个计时器来调用方法每十分钟。现在语音识别和语法每十分钟重新初始化一次,但我不确定它是初始化两次还是第一个自动终止,如果没有,是否可以这样做?


  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

    }


慕田峪7331174
浏览 160回答 1
1回答

三国纷争

由于措辞,这里有些混乱。在原来的方法调用以毫秒为单位几乎肯定完了,所以方法已被“终止”当你的计时器到期。您的代码中没有任何内容表明它正在阻塞(事件注册和“识别异步”特别提示了这一点)的副作用仍然是方法的可能但是仍然(当然在这种情况下做的)。在重新运行初始化例程之前,您必须通过手动处置/取消注册等来处理此问题。从概念的角度理解这一点非常重要,但@Heretic Monkey 对您的解决方案提出了一个很好的观点:你真的应该在 Windows API 中添加一些钩子,并在计算机唤醒时重新初始化。否则,你就是在玩猜谜游戏。
打开App,查看更多内容
随时随地看视频慕课网APP