2015-07-03 3 views
0

я писал:Как я могу поддерживать процесс C# открытым?

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

Мои приложения начинается и сразу останавливается. Что я должен сделать, чтобы мое приложение оставалось открытым и отвечало на мой _recognizer? Я не хочу писать форму Windows или консольное приложение. Я хотел бы сохранить свой распознаватель голоса в качестве фонового приложения.

+0

Что "думает" ты с '' _recognizer''? Пожалуйста, покажите нам полный код –

+0

Я реализую грамматику, а затем отправляю действие на распознанные слова.Это может быть запуск приложения или ответ с текстом на речь. –

+3

Код не помогает в этом вопросе. –

ответ

0

Вы должны написать

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(); 
    } 
} 

реализации и учебник найдено here

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(); 
    } 
} 
1

Это консольное приложение, я полагаю ..

Console.Readline(); 

будет ждать пользователю ввести ввести, а затем выйти.


UPDATE

Посмотрите на эту тему Developing a simple Windows system tray desktop app to consume a .NET web service. Возможно, это похоже на ваши потребности.

+0

Это '' Console.ReadKey (true); '' –

+1

Я просто добавил точность в свой вопрос: я не хочу писать форму Windows или консольное приложение. Я хотел бы сохранить свой распознаватель голоса в качестве фонового приложения. –

+0

Не могу ничего рассказать об этом без деталей реализации '' SpeechRecognitionEngine'' ... –

-3

Возможно, вы хотите запустить службу Windows? Вы можете проверить его here.

В

protected override void OnStart(string[] args) 
{ 
    eventLog1.WriteEntry("my service started"); 
} 

части урока Вы можете вставить SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine(); кода. Я предполагаю, что будет слушать некоторые события. Вы также устанавливаете обратные вызовы для этих событий.

Когда Вы полностью закрыть приложение Позаботься о _recognizer здесь:

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

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Wtower

+0

Я отредактировал комментарий, но пошаговое руководство по ссылке довольно охватывает все. – ntohl

+1

@Wtower Да, но то, что просит пользователь, буквально таково. Даже если эта конкретная страница будет удалена, он может просто попросить Google и выбрать первый результат поиска. Напротив, как настроить Windows-службу в VS не просто показать здесь в формате ответа без пары скриншотов или подробных объяснений. Кроме того, если мы просто скопируем/вставим учебник здесь, оригинальный постер на codeproject, несомненно, будет расстроен ... Я разочарован тем, что мой ответ получил вниз, хотя это именно то, о чем он просил, в то время как некоторые другие бессмыслицы с Console.ReadKey получил передовую. – KarmaEDV

0

При возврате основного метода, приложение закрывается, да. В этом случае все background -threads прерваны. То, что остается, - это темы переднего плана. Они поддерживают этот процесс. Это то, что делает Message Loop.

Итак, у вас должен быть какой-то цикл в потоке переднего плана (либо в основном методе, либо в любом новом созданном потоке с параметром 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(); 

ManualResetEvent позволяет ждать Quitting -Event. После того, как был вызван Set, возвращается WaitOne и ваше приложение/процесс завершается.

Смежные вопросы