我如何 "terminate" 一个 void 方法?
How can i "terminate" a void method?
我有一个 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
}
这里的措辞有些混乱。 原始方法调用几乎可以肯定在几毫秒内完成,因此当您的计时器结束时方法已经"terminated"。您的代码中没有任何内容表明它正在阻塞(事件注册和 "RecognizeAsync" 特别提示)
然而,该方法的副作用可能仍然存在(在这种情况下肯定会存在)。在重新 运行 初始化例程之前,您必须手动 disposing/deregistering 等处理这些问题。
从概念的角度理解这一点非常重要,但是@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.
我有一个 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
}
这里的措辞有些混乱。 原始方法调用几乎可以肯定在几毫秒内完成,因此当您的计时器结束时方法已经"terminated"。您的代码中没有任何内容表明它正在阻塞(事件注册和 "RecognizeAsync" 特别提示)
然而,该方法的副作用可能仍然存在(在这种情况下肯定会存在)。在重新 运行 初始化例程之前,您必须手动 disposing/deregistering 等处理这些问题。
从概念的角度理解这一点非常重要,但是@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.