2008-08-01 28 views
75

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.Niezawodny zegar w aplikacji konsolowej

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.

Odpowiedz

48

Możesz użyć czegoś takiego jak Console.ReadLine(), aby zablokować główny wątek, więc inne wątki w tle (np. Wątki z timerem) będą nadal działały. Możesz także użyć bloku AutoResetEvent, aby zablokować wykonanie, a następnie (jeśli zajdzie taka potrzeba) możesz wywołać metodę Set() na obiekcie AutoResetEvent, aby zwolnić główny wątek. Upewnij się również, że odwołanie do obiektu Timer nie wykracza poza zakres i śmieci zostały zebrane.

15

Należy rozważyć użycie ManualResetEvent, aby zablokować główny wątek po zakończeniu przetwarzania, a następnie wywołać Reset() po zakończeniu przetwarzania zegara. Jeśli jest to coś, co wymaga ciągłego działania, rozważ przeniesienie tego do procesu usługi zamiast aplikacji konsoli.