System.Zegary.Timer vs System.Gwintowanie.Timer

Sprawdzałem ostatnio niektóre z możliwych timerów i Threading.Timer i Timery .Timer są tymi, które wyglądają mi na potrzebne (ponieważ obsługują łączenie wątków).

Robię grę i planuję korzystać z wszelkiego rodzaju wydarzeń, z różnymi interwałami itp.

Który byłby najlepszy?

 482
Author: Peter, 2009-09-13

8 answers

Ten artykuł oferuje dość wyczerpujące wyjaśnienie:

"Porównanie klas timera w bibliotece klas. NET Framework " - dostępne również jako .plik chm

Różnica polega na tym, że System.Timers.Timer jest nastawiona na wielowątkowe aplikacje i dlatego jest bezpieczna dla wątków dzięki swojej właściwości SynchronizationObject, podczas gdy System.Threading.Timer nie jest bezpieczna dla wątków po wyjęciu z pudełka.

Nie wierzę, że istnieje różnica między tymi dwoma, ponieważ odnosi się do jak małe mogą być twoje interwały.

 325
Author: David Andres,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-09 11:22:10

System.Threading.Timer to zwykły timer. Oddzwania do Ciebie na wątku puli wątków (z puli pracowników).

System.Timers.Timer jest System.ComponentModel.Component, który zawija System.Threading.Timer i zapewnia dodatkowe Funkcje Używane do wysyłania na danym wątku.

System.Windows.Forms.Timer zamiast tego zawija natywny message-only-HWND i używa timerów okien do wywoływania zdarzeń w pętli wiadomości HWNDs.

Jeśli Twoja aplikacja nie ma interfejsu użytkownika, a chcesz jak najbardziej lekkiego i ogólnego przeznaczenia. Net timer, (ponieważ jesteś zadowolony z wymyślania własnych wątków/wysyłania) wtedy System.Threading.Timer jest tak dobry, jak to się robi w ramach.

Nie do końca rozumiem, jakie są domniemane problemy z "nie bezpiecznym wątkiem" z System.Threading.Timer. Być może jest to dokładnie to samo, co zadane w tym pytaniu: Thread-safety of System.Zegary.Timer vs System.Gwintowanie.Timer , a może każdy po prostu myśli, że:

  1. Łatwo jest zapisać warunki wyścigu, gdy używasz timerów. Np. zobacz to pytanie: Timer (System.Gwintowanie) zabezpieczenie gwintu

  2. Ponowne wprowadzanie powiadomień timer, gdzie zdarzenie timer może wywołać i oddzwonić second czas przed zakończeniem przetwarzania first event. Np. zobacz to pytanie: Thread-bezpieczne wykonanie za pomocą systemu.Gwintowanie.Timer i Monitor

 136
Author: Tim Lovell-Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:56

W swojej książce "CLR Via C#", Jeff Ritcher zniechęca do używania System.Timers.Timer, ten timer pochodzi z System.ComponentModel.Component, co pozwala na wykorzystanie go w powierzchni projektowej Visual Studio. Tak, że byłoby to przydatne tylko, jeśli chcesz timer na powierzchni projektowej.

Woli używać System.Threading.Timer do zadań w tle na wątku puli wątków.

 111
Author: Hero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-23 09:48:13

System.Timers.Timer wydaje się być przestarzały z. Net Core i ASP.NET Rdzeń. Spróbuj więc użyć System.Threading.Timer w przyszłych aplikacjach.


EDIT: OK, powiem dokładniej:

[[5]}z nowym. Net Core Framework, Microsoft zaprzestał niektórych technologii. NET Framework. Aby zrozumieć, że:. Net Core to zupełnie nowy framework-przepisany, wieloplatformowy itp. Nie chcę wnikać w szczegóły - proszę przeczytać . NET Blog.

Na blogu jest dobry artykuł obfitują portowanie do. NET Core, co wyjaśnia również trudności, które możesz napotkać. Jednym z nich jest użycie . NET Portability Analyzer Visual Studio Add-In i naprawienie pojawiających się błędów.

Dla klasy System.Timers.Timer, napisano, że. NET Framework, wersja = v4.6.2 jest obsługiwana, ale. Net Core,Wersja=v5. 0 i .NETPlatform, Version = v5.0 nie jest. Zalecane zmiany: Use System.Threading.Timer.

Więc wygląda na to, że {[0] } nie ma dla. Net Core.

P. S.: Ale To może wrócić-Microsoft ogłosili, że chcą wprowadzić pewne zmiany w CoreCLR (nazwa frameworku, którego używasz dla. NET Core), aby ułatwić proces portowania.

 26
Author: ice1e0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 09:27:29

Ważną różnicą, o której nie wspomniano powyżej, która może cię złapać, jest to, że System.Timers.Timer po cichu połyka wyjątki, podczas gdy System.Threading.Timer NIE.

Na przykład:

var timer = new System.Timers.Timer { AutoReset = false };
timer.Elapsed += (sender, args) =>
{
    var z = 0;
    var i = 1 / z;
};
timer.Start();

Vs

var timer = new System.Threading.Timer(x =>
{
    var z = 0;
    var i = 1 / z;
}, null, 0, Timeout.Infinite);
 23
Author: stovroz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-04 20:28:56

Znalazłem krótkie porównanie z MSDN

Biblioteka klas. NET Framework zawiera cztery klasy o nazwie Timer, każdy z nich oferuje inną funkcjonalność:

System.Timers.Timer, która wywołuje zdarzenie i wykonuje kod w jednym lub kilku zdarzeniach w regularnych odstępach czasu. Klasa przeznaczona jest do wykorzystania jako komponent serwerowy lub usługowy w wielowątkowym środowisko; nie ma interfejsu użytkownika i nie jest widoczny w czasie wykonywania.

System.Threading.Timer, które wykonuje pojedynczą metodę wywołania zwrotnego na wątku puli wątków w regularnych odstępach czasu. Metoda callback jest definiowane, gdy timer jest uruchamiany i nie można go zmienić. Jak System.Zegary.Klasa Timer, klasa ta jest przeznaczona do użytku jako komponent serwerowy lub usługowy w środowisku wielowątkowym; to nie ma interfejsu użytkownika i nie jest widoczny w czasie wykonywania.

System.Windows.Forms.Timer, komponent Windows Forms wywołujący Zdarzenie i wykonujący kod w jednym lub kilku zdarzeniach interwały. Komponent nie ma interfejsu użytkownika i jest przeznaczony do użytku w środowisku jednowątkowym.

System.Web.UI.Timer, na ASP.NET komponent, który wykonuje asynchroniczne lub synchroniczne posta strony internetowej w regularnych odstępach czasu.

 22
Author: Default,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-02 14:36:43

Obie klasy są funkcjonalnie równoważne, z tym, że System.Timers.Timer mA opcję wywoływania wszystkich wywołań zwrotnych upływu czasu przez ISynchronizeInvoke przez ustawienie SynchronizingObject . W przeciwnym razie oba timery wywołują wywołania zwrotne wygaśnięcia w wątkach puli wątków.

Gdy przeciągasz System.Timers.Timer na powierzchnię projektu Windows Forms, Visual Studio ustawia SynchronizingObject na Obiekt formularza, co powoduje, że wszystkie wywołania zwrotne wygaśnięcia są wywoływane w wątku interfejsu użytkownika.

 1
Author: Edward Brey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-09 10:56:18

From MSDN: System.Threading.Timer to prosty, lekki timer, który wykorzystuje metody callback i jest obsługiwany przez wątki puli wątków. Nie jest zalecany do stosowania z formularzami Windows, ponieważ ich wywołania zwrotne nie występują w wątku interfejsu użytkownika. System.Windows.Forms.Timer jest lepszym wyborem do użycia z formularzami Windows. W przypadku serwerowej funkcji timera można rozważyć użycie System.Timers.Timer, która wywołuje zdarzenia i ma dodatkowe funkcje.

Źródło

 1
Author: Greg0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-29 14:01:53