2012-12-27 9 views
5

Mam świadomość, że w .NET istnieją trzy typy timerów (patrz Comparing the Timer Classes in the .NET Framework Class Library). Wybrałem gwintowany zegar, ponieważ inne typy mogą dryfować, jeśli główny wątek jest zajęty i potrzebuję tego, aby był niezawodny.Jak uzyskać, aby aplikacja konsoli uruchamiała proces w tle w innym wątku bez wychodzenia?

Sposób działania tego timera w sterowaniu zegarem umieszczany jest na innym wątku, dzięki czemu zawsze można zaznaczyć razem z rozpoczęciem pracy nad rodzajem wątku, gdy nie jest zajęty.

Problem z tym zegarem w aplikacji konsolowej polega na tym, że gdy licznik czasu tyka na innym wątku, główny wątek nic nie robi, więc aplikacja się zamyka.

Próbowałem dodać pętlę while true, ale główny wątek jest zbyt zajęty, gdy timer się wyłącza.

+5

Możesz zrezygnować z cykli zegara, które są zużywane przez pętlę 'while true', dodając' Thread.Sleep (100) 'wewnątrz pętli. Prawdopodobnie istnieje lepszy sposób na zrobienie tego wszystkiego, jak na przykład tworzenie usługi Windows. –

Odpowiedz

4

Użyłbym bariery, która czeka aż wszystkie wątki zostaną wykonane. Ponieważ istnieje wątek główny i liczący, mam 2 uczestników. Tak będzie wyglądać mniej więcej tak:

Module Module1 
     Dim x As New Threading.Thread(AddressOf tick) 
     Dim y As New Threading.Barrier(2) 

     Sub Main() 
      x.IsBackground = True 
      x.Start() 
      y.SignalAndWait() 
     End Sub 

     Sub tick() 
      Threading.Thread.Sleep(10000) 
      y.SignalAndWait() 
     End Sub 
    End Module 
+2

Czy to naprawdę robi cokolwiek, czy też jest to po prostu dużo ceremonii, co równa się nieskończonej pętli z wywołaniem "Sleep()"? [Dokumentacja dla Threading.Barrier] (http://msdn.microsoft.com/en-us/library/system.threading.barrier.aspx) stwierdza, że ​​klasa Barrier * "umożliwia wielu zadaniom wspólną pracę nad algorytmem równolegle przez wiele faz. "* Nie widzę tutaj" współpracy "," równoległości "lub" wielu faz ". –

+0

Uważam, że jest to bardzo proste i dobrze wyjaśniające użycie Bariery. Główny wątek i drugi wątek działają wspólnie. To, że jest proste, nie oznacza, że ​​nie działa w sposób kooperatywny. Inną kwestią jest to, że Bariera przyjmuje taką samą ilość kodu, co Twoja sugestia "Uśpienie() w pętli", podczas gdy pasuje do bardziej skomplikowanych sytuacji (więcej wątków lub gdy każdy ms ma znaczenie itd.), Bez dodatkowych kosztów zasobów w ogóle . Dlatego użycie czegoś "blokującego" zamiast "czekania" wydawało mi się bardziej właściwym sposobem robienia tego dla mnie. – theGD

Powiązane problemy