2013-04-14 23 views
15

Hi próbuję znaleźć sposób czeka kilka milisekund przed przejściem do następnej linii kodu,Poczekaj na n sekund, potem następny wiersz kodu bez zamrażania formularz

Mam spojrzał na Thread.Sleep ale to zamrozi główny formularz, chciałbym, aby to pozostało aktywne.

Próbowałem timerów i stoperów, a następnie zamroziłem główny formularz, kiedy powinny być wysyłane na konsolę podczas zaznaczania.

Nie mogłem znaleźć sposobu użycia task.delay lub pracownika tła w oczekiwaniu, którego chciałem.

pseudokod:

Wait 2 - 6 seconds 
Log "waiting" 
Log "waiting" 
Log "waiting" 
Stop Waiting - Run next line of code. 

Metody próbowałem po prostu zamarznąć formularz i wypełnić dziennik potem, po prostu chcę prostą metodę czeka bez zamrażania formie i bez konieczności zajmowania się wydarzenia będąc wywołany, co oznaczałoby, że następna linia nie jest uruchamiana.

Każda pomoc będzie super, bo wciąż jestem nowy w C# i jego zostały jazdy mi trochę mad :(

+0

Czy to jest WinForms czy WPF? – outcoldman

+0

Windows Form Application – Sam

Odpowiedz

25

await słów kluczowych, w połączeniu z Task.Delay czyni to trywialne.

public async Task Foo() 
{ 
    await Task.Delay(2000); 
    txtConsole.AppendText("Waiting..."); 
    DoStuff(); 
} 
+0

Dzięki temu jest wszystko, czego potrzebowałem, próbowałem Task.Delay, ale nie wiedziałem, że muszę go używać w połączeniu z "Async Task" i "czekaj" – Sam

+3

@Sam Z pewnością nie masz * musieć. Mógłbyś użyć 'Task.Delay (2000) .ContinueWith (t => DoStuff(), ..., Task.Factory.FromCurrentSynchronizationContext());' zamiast tego, na co 'czekanie' ostatecznie ją naprawi. – Servy

+0

To działa świetnie, więc jestem szczęśliwy :) Jeszcze raz dziękuję! – Sam

3

Spróbuj użyć DispatcherTimer. Jest to bardzo przydatny przedmiot, który wykonuje całą pracę delegowania UI wątek

na przykład:..

private DispatcherTimer _dtTimer = null; 

public Constructor1(){ 
    _dtTimer = new DispatcherTimer(); 
    _dtTimer.Tick += new System.EventHandler(HandleTick); 
    _dtTimer.Interval = new TimeSpan(0, 0, 0, 2); //Timespan of 2 seconds 
    _dtTimer.Start(); 
} 

private void HandleTick(object sender, System.EventArgs e) { 
    _uiTextBlock.Text = "Timer ticked!"; 
} 
0

czasowy powinien działać dobrze w tym przypadku, chyba że można umieścić Thread.Sleep w jego obsługi lub sam teleskopowa zajmuje zbyt dużo czasu, aby zakończyć

Nie określono środowiska interfejsu użytkownika, którego używasz lub wersji .Net, ale w przypadku najnowszego .Net możesz użyć async/await. W ten sposób, interfejs nie będzie zamrożony natomiast kod czeka na zadania w tle

void async MyMethod() 
{ 
    var result = await Task.Run(() => long_running_code); 
}