2012-02-02 9 views
6

Mam kod, który po uruchomieniu wykonuje serię linii po kolei. Chciałbym dodać przerwę pomiędzy.Alternatywa dla Thread.Sleep in C#?

Obecnie mam go jak ten

//do work 
Thread.Sleep(10800000); 
//do work 

To jednak zamraża oprogramowania i myślę, że to dlatego, że czas snu jest zbyt długa. Szukałem w Internecie i znalazłem inną pracę o nazwie Timer. Czy ktoś może mi pokazać przykładowy kod Timera, który działa tak jak Thread.sleep?

Z góry dziękuję.

Edycja: potrzebuję oprogramowania, aby poczekać 3 godziny przed kontynuowaniem wykonywania kodu. To oprogramowanie służy do komunikacji z komputerami i nie mogę pozwolić, aby reszta kodu została wykonana podczas oczekiwania na 3 godziny.

+2

Więc ... użyć krótszego czasu snu? 10 800 000 milisekund to trzy godziny. Zegary i śpiwory służą różnym celom, nie można ich zastąpić innymi. – millimoose

+2

Er, dlaczego poprosiłeś o czas snu 10800 sekund? – Qwertie

+2

Aby wyjaśnić, czy naprawdę chcesz spać przez "10800000" milisekund (3 godziny)? – keyboardP

Odpowiedz

4

Twoje oprogramowanie zawiesiłoby się, gdyby ten sen był w głównym wątku. Należy pamiętać, że parametr jest w milisekundach. 10 800 000 milisekund = 10 800 sekund

Innym sposobem na zabicie czasu jest przekazanie obiektu TimeSpan. Ex:

// Sleep for 10 seconds 
System.Threading.Thread.Sleep(new TimeSpan(0, 0, 10)); 

chodzi o czasowy:

Można wykorzystać System.Timers.Timer;

Timer timer = new Timer(); 
timer.Interval = 20; // milliseconds 
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
timer.AutoReset = true; // if not set you will need to call start after every event fired in the elapsed callback 
timer.Start(); 
6

Patrz: this MSDN reference on the System.Threading.Timer class. Istnieje doskonałe wytłumaczenie, wszyscy członkowie klasy i przykładowy kod do naśladowania podczas testowania/uczenia się.

Pamiętaj jednak, że należy użyć Timer, aby uruchomić zdarzenie w określonym przedziale czasu. Jeśli chcesz tylko wstrzymać wykonywanie swojej aplikacji, powinieneś skorzystać z Thread.Sleep(). Jednak, jak wielu innych wskazało, powodujesz, że wątek spać będzie przez dłuższy czas.

2

Do tego jest potrzebne urządzenie Thread.Sleep, ale można użyć bardziej rozsądnego okresu uśpienia niż 3 godziny.

Aktualizacja:

Po przeczytaniu niektórych komentarzy, Thread.Sleep prawdopodobnie nie jest to, co chcesz. Zamiast tego użyj wartości System.Threading.Timer, tak jak sugerowali inni.

+0

Jeśli wymaganiem ** jest ** odczekanie 3 godzin przed uruchomieniem kodu, to użycie 'Thread.Sleep' nie jest tym, czego powinien użyć. – ken2k

+0

Zgadzam się, zaktualizowałem. –

+0

Może to być zawsze problem. Nie mówi on również o formularzu, może być usługą lub wierszem polecenia. Chociaż nie brzmi tak, jakby robił to poprawnie, istnieje mnóstwo powodów, aby coś się wydarzyło raz x godzin (db backup, funkcje czyszczenia itp.). – JeremyK

0

Śpisz przez 10800 sekund lub 3 godziny. Thread.Sleep() jest przeznaczony do zatrzymania wątku, zatrzymania czegokolwiek od pracy w oprogramowaniu na ten czas. W takim przypadku czas trwania wynosi 18 minut. Co próbujesz zrobić?

2

Twój problem polega na tym, że blokujesz główny wątek aplikacji, która jest odpowiedzialna za utrzymanie interfejsu użytkownika. Nie powinieneś tego robić. Zamiast tego korzystaj z licznika czasu - formularz jest prawdopodobnie najłatwiejszy w aplikacji Forms lub może zostać wybrany jako BackgroundWorker.(Dla tak długiego czekania bardziej odpowiedni jest czasomierz)

1

Thread.Sleep byłby zwykle używany do wstrzymywania oddzielnego wątku, a nie do głównego wątku twojej aplikacji.

Timer zazwyczaj służy do okresowego powodowania, że ​​główny wątek zatrzymuje swoje normalne operacje i obsługuje zdarzenie.

Obie metody można użyć do okresowego wykonywania funkcji po upływie określonego czasu.

To, czego bym nie zrobił, to poprosić główny wątek o spanie przez 3 godziny.

4

USE A TIMER!

private DispatcherTimer Timer; 
public Constructor 
{ 
    Timer = new System.Windows.Threading.DispatcherTimer(); 
    Timer.Tick += new EventHandler(Timer_Tick); 
    Timer.Interval = new TimeSpan(0,0,10); 
    Timer.Start(); 
} 


private void Timer_Tick(object sender, EventArgs e) 
{ 
    Timer.Stop(); 
    Timer -= Timer_Tick; 
    Timer = null; 
    // DO SOMETHING 
} 
1

Myślę, że powinieneś użyć Monitor. Pomaga umieścić na obiektach i zwolnić blokadę, gdy trzeba kontynuować program.

powinien znaleźć swoją odpowiedź tutaj: Safe Thread Synchronization

1

Można zastąpić

Thread.Sleep(X); 

przez

Task.WaitAll(Task.Delay(X));