为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕田峪7331174 2021-11-28 18:39:59
我有一个 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    }
查看完整描述

1 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

由于措辞,这里有些混乱。在原来的方法调用以毫秒为单位几乎肯定完了,所以方法已被“终止”当你的计时器到期。您的代码中没有任何内容表明它正在阻塞(事件注册和“识别异步”特别提示了这一点)

副作用仍然是方法的可能但是仍然(当然在这种情况下做的)。在重新运行初始化例程之前,您必须通过手动处置/取消注册等来处理此问题。

从概念的角度理解这一点非常重要,但@Heretic Monkey 对您的解决方案提出了一个很好的观点:

你真的应该在 Windows API 中添加一些钩子,并在计算机唤醒时重新初始化。否则,你就是在玩猜谜游戏。


查看完整回答
反对 回复 2021-11-28
  • 1 回答
  • 0 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信