Направете нишка да изчака две секунди, преди да продължи в C# WPF

Имам проблем да накарам нишка да изчака две секунди, без да блокира GUI. Най-простият метод на изчакване, който познавам, е 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
Използвам C# 4.0 и получавам две грешки, когато използвам async. Първа грешка: Името на типа или пространството от имена 'async' не може да бъде намерено (липсва ли ви директива за използване или препратка към assmbly?) И втората грешка: Невалиден токен 'void' в декларацията на член на клас, структура или интерфейс. - person Delicious Cake; 04.02.2014
comment
@DeliciousCake: Ами да, бихте го направили - защото async беше въведен в C# 5. Оттук и частта от моя отговор Ако използвате C# 5. Има ли шанс да надстроите до VS2012 или VS2013? Това ще направи живота ви много по-прост... - person Jon Skeet; 04.02.2014
comment
@Jon_Skeet За съжаление не :/ Техническото училище не ни позволява да инсталираме програми, трябва да разбера това в рамките на 1½ седмица или може да се проваля на изпита си :( - 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