Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “我怎么能?”;终止“;无效的方法?_C#_Speech Recognition - Fatal编程技术网

C# “我怎么能?”;终止“;无效的方法?

C# “我怎么能?”;终止“;无效的方法?,c#,speech-recognition,C#,Speech Recognition,我有一个void方法(希望我说的没错),它可以初始化语音识别引擎、语法和文本文件的一些路径,以便从中获取命令。现在我把代码放在一个void方法中,这样我就可以在From_Load事件中调用它,但是由于某种原因,如果PC进入睡眠状态然后备份,语音识别就无法工作,我设置了一个计时器,每十分钟调用一次该方法。现在语音记录和语法每十分钟重新初始化一次,但我不确定是初始化两次还是第一次自动终止,如果不是,是否可以这样做 public void InitGrammar() { #

我有一个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
    }

由于措辞的原因,这里有些混乱。最初的方法调用几乎肯定是在毫秒内完成的,因此当计时器过期时,该方法已经“终止”。代码中没有任何内容表明它被阻塞(事件注册和“识别Async”特别提示了这一点)

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

从概念的角度理解这一点非常重要,但“异教徒猴子”对您的解决方案提出了一个很好的观点:


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


您可以编写
return任何你想结束该方法的地方。你真的应该在Windows API中添加一些钩子,并在计算机唤醒时重新初始化。否则,你就是在玩猜谜游戏。请参见请尝试编码,但不要执行
catch(异常存在)
。捕获顶级异常是一种反模式。你应该只捕捉你能有意义地处理的特定异常。异端猴子是完全正确的。您需要进行事件处理,以便在程序生命周期状态更改时捕获。任何其他方法都将是一个丑陋的黑客。可以检查对象变量是否为“null”。如果为null,“new”将创建它的一个实例,并执行“init”代码。如果不为null,则只需调用“return”。所以,只需将引擎设置为私有全局变量。。。private SpeechRecognitionEngine recEngine=null。。。第一行代码,在init函数中-if(recEngine!=null)返回;我试着添加一些钩子,但没有多大成功。(仍然是一个noob)所以我尝试重新初始化语音记录,它可以工作,但当我给它命令时,它会回答两次。我会再试一次,它看起来确实是最好的选择@NX_会出现小故障,除非你正确地注销了旧东西,否则不管你是使用计时器还是挂钩。