Niezawodny timer w aplikacji konsolowej

103

Zdaję sobie sprawę, że w .NET istnieją trzy typy timerów (zobacz Porównanie klas timerów w bibliotece klas .NET Framework ). Wybrałem zegar z wątkami, ponieważ inne typy mogą dryfować, jeśli główny wątek jest zajęty, i potrzebuję tego, aby był niezawodny.

Sposób, w jaki ten licznik czasu działa w sterowaniu licznikiem czasu, jest umieszczany w innym wątku, dzięki czemu może zawsze tykać wraz z rozpoczęciem pracy w wątku nadrzędnym, gdy nie jest on zajęty.

Problem z tym licznikiem czasu w aplikacji konsolowej polega na tym, że podczas odliczania czasu w innym wątku główny wątek nic nie robi, aby aplikacja została zamknięta.

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

Jan
źródło

Odpowiedzi:

59

Możesz użyć czegoś takiego jak Console.ReadLine()blokowanie głównego wątku, aby inne wątki w tle (takie jak wątki z zegarem) nadal działały. Możesz również użyć AutoResetEvent, aby zablokować wykonanie, a następnie (gdy zajdzie taka potrzeba) możesz wywołać metodę Set () na tym obiekcie AutoResetEvent, aby zwolnić główny wątek. Upewnij się również, że odwołanie do obiektu Timer nie wykracza poza zakres i nie jest usuwane z pamięci.

huseyint
źródło
20

Rozważ użycie ManualResetEvent, aby zablokować główny wątek na końcu jego przetwarzania i wywołać Reset()go po zakończeniu przetwarzania timera. Jeśli jest to coś, co musi działać w sposób ciągły, rozważ przeniesienie tego do procesu usługi zamiast aplikacji konsoli.

Greg Hurlman
źródło