Заставить поток ждать две секунды, прежде чем продолжить в С# WPF

У меня возникли проблемы с тем, чтобы заставить поток ждать две секунды, не блокируя графический интерфейс. Самый простой метод ожидания, который я знаю, это Thread.Sleep(2000);. Если вы можете использовать некоторые примеры таймеров или других, о которых я не знаю, сделайте это, потому что я не слишком хорошо знаком со способами кодирования.

private void run_program_Click(object sender, RoutedEventArgs e)
{
    if (comboBox1.Text == "Drive forwards and back")
    {
        stop.IsEnabled = true;

        EngineA(90); //Makes EngineA drive at 90% power
        EngineB(90); //Makes EngineB drive at 90% power

        // Basicly it has to wait two seconds here

        EngineA(-90); // -90% power aka. reverse
        EngineB(-90); // -90% power

        // Also two seconds here

        EngineA(0); // Stops the engine
        EngineB(0); // Stops
        EngineC();
     }
}

person Delicious Cake    schedule 04.02.2014    source источник
comment
Пожалуйста, посмотрите на отредактированный источник вашего сообщения для примера того, как опубликовать блок кода - не было необходимости во всех этих обратных кавычках.   -  person Jon Skeet    schedule 04.02.2014


Ответы (3)


Если вы используете C# 5, самый простой подход — сделать метод async:

private async void RunProgramClick(object sender, RoutedEventArgs e)
{
    // Reverse the logic to reduce nesting and use "early out"
    if (comboBox1.Text != "Drive forwards and back")
    {
        return;
    }

    stop.IsEnabled = true;
    EngineA(90);
    EngineB(90);

    await Task.Delay(2000);

    EngineA(-90);
    EngineB(-90);

    await Task.Delay(2000);

    EngineA(0);
    EngineB(0);
    EngineC();
}
person Jon Skeet    schedule 04.02.2014
comment
Я использую С# 4.0 и получаю две ошибки при использовании асинхронности. Первая ошибка: не удалось найти имя типа или пространства имен «async» (вам не хватает директивы использования или ссылки на сборку?) И вторая ошибка: недопустимый токен «void» в объявлении класса, структуры или интерфейса. - person Delicious Cake; 04.02.2014
comment
@DeliciousCake: Ну да, вы бы так и сделали, потому что асинхронность была введена в C # 5. Следовательно, часть моего ответа «Если вы используете C # 5». Есть ли шанс, что вы могли бы перейти на VS2012 или VS2013? Это сделало бы вашу жизнь намного проще... - person Jon Skeet; 04.02.2014
comment
@Jon_Skeet К сожалению, нет: / Техническая школа не позволяет нам устанавливать программы, мне нужно выяснить это в течение полутора недель, иначе я могу провалить экзамен :( - person Delicious Cake; 05.02.2014
comment
@DeliciousCake: В этом случае я предлагаю вам использовать файл DispatcherTimer. Это позволит вам эффективно отложить часть работы на потом. - person Jon Skeet; 05.02.2014
comment
@Jon_Skeet Есть пример того, как заставить ждать две секунды в двух командах? Это очень поможет, если я смогу уйти от этой проблемы - person Delicious Cake; 05.02.2014
comment
@DeliciousCake: Ну, вы смотрели на DispatcherTimer и пытались его использовать? Это не будет ужасно простой код (не такой простой, как просто подождать здесь), но вам следует сначала попробовать сделать это самостоятельно, а затем, возможно, задать новый вопрос с вашим кодом, если вы столкнетесь с проблемами. . - person Jon Skeet; 05.02.2014

Я нашел этот подход проще,

var task = Task.Factory.StartNew(() => Thread.Sleep(new TimeSpan(0,0,2)));
Task.WaitAll(new[] { task });

Поздний ответ, но я надеюсь, что он будет полезен для кого-то.

person Mohan    schedule 14.06.2016

person    schedule
comment
На SO есть как минимум дюжина дубликатов этого вопроса, и это решение - person Mikkel Bang; 28.07.2015