Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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进程处于打开状态?_C# - Fatal编程技术网

C# 如何保持C进程处于打开状态?

C# 如何保持C进程处于打开状态?,c#,C#,我写道: class Script { [STAThread] static public void Main(string[] args) { SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine(); // I do many thinks with this _recognizer } } 我的应用程序立即启动和停止。我应该怎么做才能使我的应用程序

我写道:

class Script
{
    [STAThread]
    static public void Main(string[] args)
    {
        SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine();
        // I do many thinks with this _recognizer
    }
}

我的应用程序立即启动和停止。我应该怎么做才能使我的应用程序保持打开状态并响应我的\u识别器?我不想编写Windows窗体或控制台应用程序。我想保留我的语音识别器作为后台应用程序。

我想这是一个控制台应用程序吧

Console.Readline();
将等待用户键入enter,然后退出

更新

看这根线。
也许这与您的需求类似。

也许您想要运行Windows服务?你可以去看看

protected override void OnStart(string[] args)
{ 
    eventLog1.WriteEntry("my service started"); 
}
在本教程中,您可以插入SpeechRecognitionEngine\u recognizer=new SpeechRecognitionEngine;内部代码。我想这会听到一些事件。您也可以在此处设置这些事件的回调

当您完全关闭应用程序时,请注意此处的_识别器:

protected override void OnStop()
{ 
    eventLog1.WriteEntry("my service stoped");
}

当main方法返回时,应用程序关闭,是的。在这种情况下,所有后台线程都将中止。剩下的是前台线程。他们让这个过程保持活力。这就是消息循环的作用

因此,前台线程中必须有任何类型的循环,无论是在main方法中,还是在IsBackground属性设置为false的任何新创建的线程中

这可能看起来像:

SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine();
while (_recognizer.IsActive) // or something similar
{
    Thread.Sleep(100);
}
这绝对不是一种美,因为它浪费资源,并且使用Thread.Sleep。当SpeechRecognitionEngine有一个事件想要退出时,您可能会遇到以下情况:

ManualResetEvent reset = new ManualResetEvent(false);
SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine();
_recognizer.Quitting += new EventHandler((sender, args) =>
{
    reset.Set();
});
reset.WaitOne();
ManualReset事件允许您等待退出事件。调用Set后,WaitOne返回,应用程序/进程结束。

您应该编写

class Script
{
    [STAThread]
    static public void Main(string[] args)
    {
        _completed = new ManualResetEvent(false);
        SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine();
        // I do many thinks with this _recognizer
        // Add an exit event that should call _completed.Set();
        _completed.WaitOne();
    }
}
找到了实现和教程


这是Console.ReadKeytrue;我只是在我的问题中添加了一点精确性:我不想编写Windows窗体或控制台应用程序。我想保留我的语音识别器作为后台应用程序。如果没有SpeechRecognitionEngine的实现细节,就无法说明这一点……该应用程序的工作部分需要以某种形式的循环响应Windows消息和语音识别引擎。您认为如何使用\u识别器?请向我们展示您的完整代码我执行语法,然后发送识别单词的操作。这可能是在启动应用程序或以文本到语音的方式进行响应。代码对这个问题没有帮助。@m4tth132kshsdvg您想要一个?不。一个简单的后台应用程序。我不需要控制台,也不需要窗户。它可以是一项服务,但我不需要将其作为一项服务启动。我只需要一个在后台工作的应用程序。实际上,用户界面只是通过语音控制和接收的。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,只有链接的答案可能会变得无效。我已经编辑了注释,但是链接的分步教程涵盖了所有内容。@W回答是的,但用户要求的就是这样。即使这个特定的页面被删除了,他也可以询问谷歌并选择第一个搜索结果。相反,如果没有几个屏幕截图或详细的解释,那么在VS中如何设置Windows服务在这里很难以答案的形式显示出来。此外,如果我们只是复制/粘贴这里的教程,codeproject上的原始海报肯定会被打乱。。。我很失望,我的答案被否决了,尽管这正是他一直在要求的,而Console.ReadKey的其他一些胡说八道的东西被否决了。@Karmedv很抱歉你的答案被否决了。如果有什么安慰的话,我没有对这两个答案中的任何一个投反对票,但我可以理解,其他用户可能会投反对票,因为任何链接都需要在这些答案中有上下文。仅仅用谷歌搜索是不够的。
static void Main(string[] args)
{
    _completed = new ManualResetEvent(false);
    SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine();
    _recognizer.LoadGrammar(new Grammar(new GrammarBuilder("test")) Name = { "testGrammar" }); // load a grammar
    _recognizer.LoadGrammar(new Grammar(new GrammarBuilder("exit")) Name = { "exitGrammar" }); // load a "exit" grammar
    _recognizer.SpeechRecognized += _recognizer_SpeechRecognized;
    _recognizer.SetInputToDefaultAudioDevice(); // set the input of the speech recognizer to the default audio device
    _recognizer.RecognizeAsync(RecognizeMode.Multiple); // recognize speech asynchronous
    _completed.WaitOne(); // wait until speech recognition is completed
    _recognizer.Dispose(); // dispose the speech recognition engine
}

void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
     if (e.Result.Text == "test") // e.Result.Text contains the recognized text
     {
         Console.WriteLine("The test was successful!");
     } 
     else if (e.Result.Text == "exit")
     {
         _completed.Set();
     }
}