2012-06-25 11 views
8

Główny wątek aplikacji wykonuje pewną pracę.Metoda połączenia asynchronicznego C# okresowo

Istnieje również zegar, który powinien co 10 minut wywoływać metodę, która powinna działać asynchronicznie.

Czy mógłby Pan podać mi dobry przykład, jak to zorganizować?

+2

Czy to jest ASP.NET, formularze, inne? –

+1

Czy to jest aplikacja GUI? – Tudor

+0

Jest to usługa Windows, która w rzeczywistości jest serwerem i zawsze nasłuchuje nowych połączeń. Więc nie ma GUI, ale praca serwera nie powinien być zatrzymany – Ksice

Odpowiedz

12

nie polecam przy użyciu wyraźny wątek z pętli i snu. To zła praktyka i brzydka. W tym celu dostępne są klasy zegara:

Jeśli nie jest to aplikacja GUI, można użyć System.Threading.Timer do okresowego wykonywania kodu w innym wątku.

Jeśli jest to aplikacja WinForm/WPF, spójrz na odpowiednio System.Windows.Forms.Timer i System.Windows.Threading.DispatcherTimer. Są przydatne, ponieważ wykonują swój kod w wątku GUI, a więc nie wymagają wyraźnych wywołań Invoke.

Linki zawierają również przykłady dla każdego z nich.

+0

Po prostu ciekawość, jeśli te czasomierze wykonać na wątku GUI będą blokować główne zastosowanie, chyba osobny wątek jest lepsze dla wymogiem asynchronicznego? Zgadzam się jednak, że utrzymywanie całego wątku przy życiu do wykonania co 10 minut nie jest jednak idealne. – Vok

+0

@Vok: To zależy od tego, co musisz zrobić. Te zegary są dobre dla szybkiej okresowej aktualizacji GUI. Jeśli kod jest bardziej długotrwały, powinieneś użyć 'System.Threading.Timer' z jawnym' Invoke' tylko dla części aktualizacji. W każdym razie dobrze znać narzędzia dostępne w różnych sytuacjach. – Tudor

1

Najprostszym sposobem jest wywołanie jednej dużej funkcji, która przesyła 10 minut między kolejnymi operacjami. To nie blokuje niczego, ponieważ znajduje się w innym wątku.

W .NET 4, byś to robić z klasą Task:

Task t = Task.Factory.StartNew(() => { /* your code here */ }); 
// or 
Task t = Task.Factory.StartNew(YourFunctionHere); 

void YourFunction() { 
    while (someCondition) { 
     // do something 
     Thread.Sleep(TimeSpan.FromMinutes(10)); 
    } 
} 

(kod ten nie został przetestowany)

0

użyć wątek BackgroundWorker.

void FireTask() 
{ 
    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.RunWorkerAsync(); 
} 

void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    //Your job 
} 
-2

rozpocząć kolejny wątek, który uruchamia pętlę

Wewnątrz pętli; spać przez 10 minut, a następnie zadzwoń do metody, powtórz

Powiązane problemy