“Засыпание” программы на некоторое время

242
28 апреля 2017, 16:34

Нужно приостанавливать программу на некоторое время в некотором месте. Пытаюсь сделать так, чтобы между текстом пользователя и выводом ответа проходило некоторое время(вопрос-время-ответ), но при использовании Thread.Sleep() программа засыпает до вывода вопрос-ответ(время-вопрос-ответ). Подскажите, как сделать

 static void sre_speech(object sender,SpeechRecognizedEventArgs e)
    {
        string answer="Извини, не поняла";
        if (e.Result.Confidence > 0.82)
            {t.Text += "Ivan:>"+e.Result.Text+Environment.NewLine;
            switch (e.Result.Text)
            {
            case "Привет":
                answer = "Привет, Иван";
                break;
            case "Как дела":
                answer = "У меня неплохо :)";
                break;
            case "Сколько времени":
                answer = dt.Hour+":"+dt.Minute+":"+dt.Second;
                break;                
           } 
        }
        Thread.Sleep(1500);
        t.Text += "Caroline:>" + answer + Environment.NewLine;
    }`
  private void form1_Shown(object sender, EventArgs e)
    {
        t = chat;
        CultureInfo ci = new CultureInfo("ru-ru");
        SpeechRecognitionEngine sre = new SpeechRecognitionEngine(ci);
        sre.SetInputToDefaultAudioDevice();
        sre.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sre_speech);
        Choices words = new Choices();
        words.Add(new string[] {"Привет","Как дела","Сколько времени" });
        GrammarBuilder gb = new GrammarBuilder();
        gb.Append(words);
        Grammar g = new Grammar(gb);
        sre.LoadGrammar(g);
        sre.RecognizeAsync(RecognizeMode.Multiple);
    }`

Вот вводится пользователем фраза(например, спрашивается , сколько времени) , а ответ должен выводится не сразу, через некоторое время (как некая симуляция обдумывания)

Answer 1

Почему бы не сделать ваш sre_speech асинхронным? (кстати, вы уверены, что обработчик должен быть static? Тогда что такое t и как оно объявлено?)

private async void sre_speech(object sender,SpeechRecognizedEventArgs e)
{
    ...
    await Task.Delay(1500); // вместо Thread.Sleep(1500);
    ...
}

Update:

Как верно заметил @klutch1991, если все-таки t - ссылка на UI контрол, то в итоге это будет выглядеть так:

private async void sre_speech(object sender,SpeechRecognizedEventArgs e)
{
    string answer="Извини, не поняла";
    if (e.Result.Confidence > 0.82)
    {
        AppendTextToChat("Ivan", e.Result.Text);
        switch (e.Result.Text)
        {
            ... 
        } 
    }
    await Task.Delay(1500);
    AppendTextToChat("Caroline", answer);
}`
private void AppendTextToChat(string name, string text)
{
    Application.Current.Dispatcher.Invoke(
        () => t.Text += $"{name}:>{text}{Environment.NewLine}");
}
READ ALSO
TcpClient не поспевает за данными от сервера

TcpClient не поспевает за данными от сервера

Проблема: отправляю данные с сервера на клиент (оба на локальной машине) и часть данных клиент не успевает обработать/принять в буферИногда...

312
Как привязать (Binding) команду (ICommand) к кнопке на FluentRibbon из UserControl (MVVM)

Как привязать (Binding) команду (ICommand) к кнопке на FluentRibbon из UserControl (MVVM)

В проекте имеется много разных сущностей, которые надо отображать и списком в таблице и подробно и иметь возможность каждую правитьДля этого...

367
Открыть с помощью

Открыть с помощью

VS2015, Win10, программа на C# WPF

232
Чем отличается iTextSharp от iText и что сейчас лучше использовать?

Чем отличается iTextSharp от iText и что сейчас лучше использовать?

В Nuget сейчас обе библиотеки имеют достаточно свежие версии

272