/ / Czy liczniki c # są naturalnie wielowątkowe? - c #, wielowątkowość, timer

Czy liczniki c # są naturalnie wielowątkowe? - c #, wielowątkowość, timer

Jeśli mam dwa timery systemowe odpalające zdarzenia o 10odpowiednio 20 i 20, czy wywołania funkcji zdarzeń są wielowątkowe? W poniższym scenariuszu mam liczniki, które uruchamiają zdarzenia odpowiednio w odstępach 10 i 12 sekund. Najpierw należy wywołać funkcję „My10sEvent”. Jeśli jest to wolna funkcja, której uruchomienie zajmuje 8 sekund, to czy zablokuje inne zdarzenie (tmr12s), czy też drugie zdarzenie zadziała o czasie 12s?

System.Timers.Timer tmr10s = new System.Timers.Timer(10000.0);
tmr10s.Enabled = true;
tmr10s.Elapsed += new ElapsedEventHandler(My10sEvent);

System.Timers.Timer tmr12s = new System.Timers.Timer(12000.0);
tmr12s.Enabled = true;
tmr12s.Elapsed += new ElapsedEventHandler(My12sEvent);

Thread.Sleep(System.Threading.Timeout.Infinite); //sleep indefinitely to let the above events fire

Odpowiedzi:

4 dla odpowiedzi № 1

CLR używa dedykowanego wątku do śledzenia aktywnych timerów System.Timers.Timer i System.Threading.Timer. Zdarzenie Elapsed jest wywoływane w innym wątku wyciągniętym z puli wątków.

Tak, tak, tykają bez wpływu na każde z nichinny. Musisz być bardzo ostrożny, całkiem możliwe jest, że Twój program obsługi zdarzeń Elapsed zostanie ponownie wywołany, gdy jest on nadal wykonywany. Co się dzieje, gdy trwa to dłużej niż interwał. Lub gorzej, gdy maszyna jest mocno obciążona lub masz wiele aktywnych wątków puli wątków. Może to spowodować bardzo trudne zdiagnozowanie błędu, jeśli moduł obsługi zdarzeń nie jest bezpieczny dla wątków. Prawie nigdy nie jest. Ustawienie właściwości AutoReset timera na false to prosty sposób na uniknięcie tego problemu.


3 dla odpowiedzi № 2

Wygląda na to, że nie zablokuje się, jeśli używasz System.Threading.Timer lub wywołujesz System.Timers.Timer bez SynchronizingObject.

Podobne pytanie: Czy liczniki C # upływają w osobnym wątku?


1 dla odpowiedzi nr 3

Od System.Timers.Timer dokumentacja:

Timer oparty na serwerze jest przeznaczony do użytku zwątki robocze w środowisku wielowątkowym. Liczniki czasu serwera mogą przemieszczać się między wątkami, aby obsłużyć podniesione zdarzenie Upływające, co zapewnia większą dokładność niż liczniki czasu systemu Windows w zakresie podnoszenia zdarzenia na czas.

Tak, tak jest.

Ponadto z System.Timers.Timer.SynchronizingObject dokumentacja nieruchomości:

Gdy SynchronizingObject ma wartość NULL, metoda, która obsługuje zdarzenie Elapsed, jest wywoływana w wątku z systemowej puli wątków. Aby uzyskać więcej informacji o pulach wątków systemowych, zobacz temat ThreadPool.

Tak więc zdarzenia są wywoływane w wątkach puli wątków, chyba że ustawiony jest SynchronizingObject.