2012-07-24 17 views
5
string connectionstring = "server =SQLVS2\\SQLVS2;database=DDM;Persist Security Info=True;uid=ddmuser;password=User02+Ddm;"; 
    SqlConnection myConnection = new SqlConnection(connectionstring); 
    SqlCommand myCommand = new SqlCommand("GetNullHash", myConnection); 
    myCommand.CommandType = CommandType.StoredProcedure; 
    myConnection.Open(); 
    SqlDataReader rdr = myCommand.ExecuteReader(); 

    while (rdr.Read()) 
    { 
     string filename = @"\\" + rdr.GetString(3); 
     filename = System.IO.Path.Combine(filename, rdr.GetString(2)); 
     filename = System.IO.Path.Combine(filename, rdr.GetString(1)); 
     computeHashh1 abc = new computeHashh1(); 
     Console.WriteLine(abc.computeHash(filename));   
     inserthash insert = new inserthash(); 
     insert.InsertHash(rdr.GetString(1), abc.computeHash(filename), rdr.GetStr(2),rdr.GetString(3)); 

    } 

Jak mogę uruchomić tę pętlę raz na 5 sekund na zawsze lub do zatrzymania.jak zrobić nieskończoną pętlę z 5-sekundowymi przerwami

Odpowiedz

12

Najprostszą metodą byłoby:

while (true) { 
    // code here 
    Thread.Sleep(5000); 
} 

jednak do solidności, ja polecam windows service z proper timer.

+0

Jak napisać odpowiedni zegar w serwisie Windows? im rzeczywiście przy użyciu usługi Windows w tym, ale nie ma czasomierza – tipi

+0

Spójrz na link mam na 'właściwego timera'. – mellamokb

+0

jak możesz to zatrzymać? –

4

Spróbuj:

while(true) 
{ 
    try 
    { 
     thread.sleep(5000) 
    } 
    catch(Exception e) 
    { 
     //handle the exception 
    } 
} 

Jego najbardziej proste.

+0

Ahh pobity do tego – Nathaniel

+0

Dlaczego timer jest lepszym rozwiązaniem? –

+0

Zobacz - ma ładne wyjaśnienie http://stackoverflow.com/questions/391621/compare-using-thread-sleep-and-timer-for-delayed-execution – Nathaniel

5

bym owinąć swój kod i użyć obiektu timera, który pozwoli Ci mieć kontrolę nad tym samym zegarem (stop, start, etc)

System.Timers.Timer aTimer; 
aTimer = new System.Timers.Timer(); 
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
aTimer.Interval = 2000; 
aTimer.Enabled = true; 

private void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    //your code 
} 

Więcej informacji na

http://msdn.microsoft.com/en-us/library/system.timers.timer%28v=vs.100%29.aspx

+0

Dlaczego ktoś musiałby zatrzymać/uruchomić zegar dla nieskończonej pętli? –

+0

OP: w jaki sposób mogę uruchomić tę pętlę raz na 5 sekund na zawsze lub do momentu zatrzymania. –

+0

"5 sekund na zawsze" - proste. "lub do zatrzymania" - dość łatwe: Menedżer zadań/Usługi/Zatrzymaj usługę. –

0

Cóż, gdybym to zrobił, a ograniczenia w tym przedziale nie byłyby precyzyjne i chciałem być absolutnie pewien, że wiele zdarzeń timera nigdy nie spowoduje ponownego wprowadzenia mojego kodu, jeśli mój kod od czasu do czasu trwa dłużej niż interwał, Po prostu używaj pętli sleep() i pracuj bez żadnych zewnętrznych zegarów, które po prostu dodają złożoności do tego, co wydaje się być prostym wymogiem.

Poza wątkiem GUI, który musi przetwarzać komunikaty (lub główny wątek serwisowy, który musi przetwarzać start/stop itp.), Zegary są często nieodpowiednie, niewygodne lub, jeśli inny wątek/pula musi podnieść zdarzenie licznika czasu, marnotrawstwo przełączniki kontekstowe.

Nie ma żadnego problemu, na Vista/W7 tak, z zatrzymaniem usługi, która spawnuje wątki, które śpią. Osiągnięcie przez system operacyjny ok. 20 sekund, aby zdać sobie sprawę, że mimo iż główny wątek usługi obsługiwał komunikat zatrzymania, proces obsługi nadal blokuje wątki - to i tak kończy proces obsługi, zabijając wszelkie uśpione/działające/oczekujące/dowolne wątki .

Powiązane problemy