我如何“终止”无效方法?
作者:互联网
我有一个void方法(希望我说的没错),它初始化语音识别引擎,语法和文本文件的一些路径以从中获取命令.现在,我将代码放入了void方法中,以便可以在From_Load事件中调用它,但是由于某些原因,如果PC进入睡眠状态然后备份,语音识别将无法正常工作,因此我设置了一个计时器来调用每十分钟一次.现在,语音记录和语法每隔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
}
解决方法:
由于措辞,这里有些混乱.原始方法调用几乎可以肯定在毫秒内完成,因此当您的计时器经过时,该方法已经“终止”.您的代码中没有任何内容表明它正在阻止(事件注册和“ RecognizeAsync”在此特别提示)
但是,该方法的副作用可能仍然存在(在这种情况下肯定会发生).在重新运行初始化例程之前,您必须通过手动处置/注销等方式来处理此问题.
从概念的角度来理解这一点非常重要,但是@Heretic Monkey总体上很好地说明了您的解决方案:
You should really add some hooks into the Windows API and reinitialize when the computer wakes up. Otherwise, you’re playing a guessing game.
标签:speech-recognition,c 来源: https://codeday.me/bug/20191108/2009400.html