Ostatnio sprawdzałem niektóre z możliwych timerów System.Threading.Timer
iSystem.Timers.Timer
są to te, które wydają mi się potrzebne (ponieważ obsługują pule wątków).
Tworzę grę i planuję używać wszelkiego rodzaju wydarzeń, w różnych odstępach czasu itp.
Który byłby najlepszy?
Threading.Timer
„s artykule MSDN , jest całkowicie bezpieczny wątku ...System.Threading.Timer
jest tak „ironicznie”, że nie jest wątkowo bezpieczny,System.Threading.Thread
a nici uzyskane przez pulę. Tylko dlatego, że klasy te nie trzymają ręki ilock
same zarządzają użyciem słowa kluczowego, nie oznacza, że te klasy nie są bezpieczne dla wątków. Równie dobrze można powiedzieć, żeSystem.Threading.Thread
nie jest wątkowo bezpieczny, ponieważ jest dokładnie tak samo.SynchronizingObject
powoduje, że sam obiekt timera jest bezpieczny dla wątków. Po prostu upewnia się, że Twój kod do obsługi zdarzenia licznika czasu jest wywoływany w określonym wątku (jeśli odpowiednio ustawisz tę właściwość). Sam obiekt timera nie jest gwarantowany pod kątem bezpieczeństwa wątków, jak to wyraźnie zaznaczono w dokumentacji. Z drugiej stronySystem.Threading.Timer
obiekt jest specjalnie udokumentowany jako bezpieczny dla wątków.System.Threading.Timer
jest zwykłym zegarem. Wywołuje cię z powrotem w wątku puli wątków (z puli procesów roboczych).System.Timers.Timer
jest to,System.ComponentModel.Component
które otacza aSystem.Threading.Timer
, i zapewnia pewne dodatkowe funkcje używane do wysyłania w określonym wątku.System.Windows.Forms.Timer
zamiast tego pakuje natywny HWND tylko do wiadomości i używa Timerów Windows do wywoływania zdarzeń w tej pętli komunikatów HWND.Jeśli Twoja aplikacja nie ma interfejsu użytkownika, a chcesz jak najlżejszy i najbardziej uniwersalny zegar .Net (ponieważ z przyjemnością wymyślasz własne wątki / wysyłanie)
System.Threading.Timer
jest tak dobry, jak to możliwe w środowisku.Nie jestem do końca jasne, z jakimi rzekomymi problemami
System.Threading.Timer
są „nie wątkowe” . Być może jest to to samo, co zadane w tym pytaniu: Bezpieczeństwo wątków System.Timers.Timer vs. System.Threading.Timer , a może wszyscy po prostu oznaczają, że:łatwo jest pisać warunki wyścigu, korzystając z liczników czasu. Np. Zobacz to pytanie: Bezpieczeństwo wątków Timer (System.Threading)
ponowne wejście powiadomień timera, w którym zdarzenie timera może się uruchomić i oddzwonić po raz drugi, zanim zakończysz przetwarzanie pierwszego zdarzenia. Np. Patrz pytanie: Bezpieczne wykonywanie wątków za pomocą System.Threading.Timer i Monitor
źródło
System.Timers.Timer
zastosowaniaSystem.Threading.Timer
wewnętrznie. Zobacz kod źródłowy .W swojej książce „ CLR Via C # ” Jeff Ritcher odradza korzystanie z
System.Timers.Timer
tego timeraSystem.ComponentModel.Component
, co pozwala na jego wykorzystanie w powierzchni projektowej Visual Studio. Przydałoby się to tylko wtedy, gdy chcesz mieć zegar na powierzchni projektowej.Preferuje
System.Threading.Timer
wykonywanie zadań w tle w wątku puli wątków.źródło
System.Threading.Timer
jest podobne do korzystania z puli wątków lub tworzenia własnego wątku. Z Oczywiście te zajęcia nie obsługuje synchronizacji dla ciebie - to twoja praca! Ani wątek puli wątków, twój własny wątek, ani wywołanie zwrotne licznika czasu nie poradzą sobie z blokowaniem - na jakim obiekcie, w jakiej modzie iw jakich okolicznościach musisz zablokować, wymaga dobrej oceny, a wersja licznika wątków zapewnia największą elastyczność i ziarnistość.Informacje od Microsoft na ten temat (patrz Uwagi na MSDN ):
Warto o tym wspomnieć
System.Timers.Timer
został wycofany z .NET Core 1.0, ale został ponownie zaimplementowany w .NET Core 2.0 (/ .NET Standard 2.0). Celem .NET Standard 2.0 było, aby przejście z systemu .NET Framework było jak najłatwiejsze, co prawdopodobnie jest przyczyną jego powrotu.Kiedy było przestarzałe, zalecany był dodatek .NET Portability Analyzer Visual Studio Add-In
System.Threading.Timer
.Wygląda na to, że Microsoft preferuje
System.Threading.Timer
wcześniejSystem.Timers.Timer
.INFORMACJA O EDYCJI 15.11.2018: Zmieniam rękę, ponieważ stare informacje o .NET Core 1.0 nie były już aktualne.
źródło
Jedną ważną, nie wymienioną powyżej różnicą, która może cię złapać, jest to, że
System.Timers.Timer
cicho połyka wyjątki, podczasSystem.Threading.Timer
gdy nie.Na przykład:
vs
źródło
Znalazłem krótkie porównanie z MSDN
źródło
Te dwie klasy są funkcjonalnie równoważne, z wyjątkiem tego, że
System.Timers.Timer
ma opcję wywoływania wszystkich wywołań zwrotnych upływu czasu przez ISynchronizeInvoke poprzez ustawienie SynchronizingObject . W przeciwnym razie oba liczniki wywołują wywołania zwrotne utraty ważności w wątkach puli wątków.Podczas przeciągania znaku
System.Timers.Timer
na powierzchnię projektu Windows Forms Visual Studio ustawia SynchronizingObject na obiekt formularza, co powoduje, że wszystkie wywołania zwrotne wygasania są wywoływane w wątku interfejsu użytkownika.źródło
Z MSDN:
System.Threading.Timer
to prosty, lekki licznik czasu, który wykorzystuje metody wywołania zwrotnego i jest obsługiwany przez wątki puli wątków. Nie zaleca się używania go z Windows Forms, ponieważ jego wywołania zwrotne nie występują w wątku interfejsu użytkownika.System.Windows.Forms.Timer
jest lepszym wyborem do użycia z Windows Forms. W przypadku funkcji czasomierza opartej na serwerze można rozważyć użycieSystem.Timers.Timer
, która wywołuje zdarzenia i ma dodatkowe funkcje.Źródło
źródło