Question System.Timers.Timer vs System.Threading.Timer


J'ai vérifié quelques-uns des minuteurs possibles récemment, et le Threading.Timer et Timers.Timer sont ceux qui me semblent nécessaires (puisqu'ils supportent le pool de threads).

Je fais un jeu, et j'ai l'intention d'utiliser tous les types d'événements, avec des intervalles différents, etc.

Quel serait le meilleur?


477
2017-09-13 03:56


origine


Réponses:


Cet article offre une explication assez complète:

"Comparaison des classes de minuteur dans la bibliothèque de classes .NET Framework" - aussi disponible en tant que fichier .chm

La différence spécifique semble être que System.Timers.Timer est orienté vers des applications multithread et est donc thread-safe via son SynchronizationObject propriété, alors que System.Threading.Timer est ironiquement pas thread-safe out-of-the-box.

Je ne crois pas qu'il y ait une différence entre les deux en ce qui a trait à la petite taille de vos intervalles.


323
2017-09-13 03:59



System.Threading.Timer est une minuterie ordinaire. Il vous rappelle sur un thread de pool de threads (à partir du pool de travailleurs).

System.Timers.Timer est un System.ComponentModel.Component qui enveloppe un System.Threading.Timeret fournit des fonctionnalités supplémentaires utilisées pour l'envoi sur un thread particulier.

System.Windows.Forms.Timer à la place, enveloppe un natif Message-seulement-HWND et utilise Minuteries pour déclencher des événements dans cette boucle de message HWNDs.

Si votre application n'a pas d'interface utilisateur et que vous souhaitez utiliser le minuteur .Net le plus léger et le plus polyvalent possible (parce que vous êtes satisfait de votre propre threading / dispatching), alors System.Threading.Timer est aussi bon que possible dans le cadre.

Je ne suis pas tout à fait clair ce que les problèmes supposés "pas thread safe" avec System.Threading.Timer sont. Peut-être est-ce la même chose que celle posée dans cette question: Thread-safety de System.Timers.Timer vs System.Threading.Timer, ou peut-être tout le monde veut juste dire que:

  1. il est facile d'écrire des conditions de course lorsque vous utilisez des minuteries. Par exemple. voir cette question: Sécurité du fil de minuterie (System.Threading)

  2. ré-entrée des notifications de minuterie, où votre événement de minuterie peut déclencher et vous rappeler un seconde temps avant de terminer le traitement du premier un événement. Par exemple. voir cette question: Exécution thread-safe en utilisant System.Threading.Timer et Monitor


132
2018-01-28 15:47



Dans son livre "CLR Via C #", Jeff Ritcher décourage l'utilisation System.Timers.Timer, cette minuterie est dérivée de System.ComponentModel.Component, lui permettant d'être utilisé dans la surface de conception de Visual Studio. Alors que ce ne serait utile que si vous voulez une minuterie sur une surface de conception.

Il préfère utiliser System.Threading.Timer pour les tâches en arrière-plan sur un thread de pool de threads.


111
2018-04-12 10:51



System.Timers.Timer semble être obsolète avec .NET Core et ASP.NET Core. Alors essayez d'utiliser System.Threading.Timer dans les futures applications.


MODIFIER: OK, laissez-moi être plus précis:

Avec le nouveau .NET Core Framework, Microsoft a abandonné certaines technologies de .NET Framework. Pour comprendre cela: .NET Core est un cadre totalement nouveau - réécrit, cross plate-forme, etc. Je ne veux pas aller en profondeur ici en détail - s'il vous plaît lire la Blog .NET.

Sur le blog est un bon article abondant portage à. NET Core qui explique également les difficultés que vous pouvez frapper. Une partie de ceci est d'utiliser le Complément Visual Studio de .NET Portability Analyzer et corrige les erreurs que vous obtenez.

Pour le System.Timers.Timer classe, dit-il, que .NET Framework, Version = v4.6.2 est supporté, mais .NET Core, Version = v5.0 et .NETPlatform, Version = v5.0 ne l'est pas. Changements recommandés: Use System.Threading.Timer.

Alors ça me regarde System.Timers.Timer est parti pour .NET Core.

P.S .: Mais cela pourrait revenir - Microsoft a annoncé qu'il souhaitait apporter des modifications à CoreCLR (le nom du framework que vous utilisez pour .NET Core) pour faciliter le travail de portage.


26
2018-06-21 19:39



J'ai trouvé une courte comparaison de MSDN

La bibliothèque de classes .NET Framework comprend quatre classes nommées Timer,   chacun d'entre eux offre des fonctionnalités différentes:

System.Timers.Timer, qui déclenche un événement et exécute le code dans un ou plusieurs événe- ments à intervalles réguliers. La classe est destinée   pour une utilisation en tant que composant de serveur ou de service dans un système multithread   environnement; il n'a pas d'interface utilisateur et n'est pas visible au moment de l'exécution.

System.Threading.Timer, qui exécute une méthode de rappel unique sur un thread de pool de threads à intervalles réguliers. La méthode de rappel est   défini lorsque le temporisateur est instancié et ne peut pas être modifié. Comme le   Classe System.Timers.Timer, cette classe est destinée à être utilisée comme   composant serveur ou service dans un environnement multithread; il   n'a pas d'interface utilisateur et n'est pas visible au moment de l'exécution.

System.Windows.Forms.Timer, un composant Windows Forms qui déclenche un événement et exécute le code dans un ou plusieurs événe- ments d'événement à intervalles réguliers.   intervalles. Le composant n'a pas d'interface utilisateur et est conçu pour être utilisé   dans un environnement à un seul thread.

System.Web.UI.Timer, un composant ASP.NET qui effectue des publications asynchrones ou synchrones sur une page Web à intervalles réguliers.


22
2017-10-02 14:36



Une différence importante non mentionnée ci-dessus qui pourrait vous surprendre est que System.Timers.Timer avale silencieusement des exceptions, alors que System.Threading.Timer ne le fait pas.

Par exemple:

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

contre

var timer = new System.Threading.Timer(x =>
{
    var z = 0;
    var i = 1 / z;
}, null, 0, Timeout.Infinite);

18
2018-04-04 20:28



Les deux classes sont fonctionnellement équivalentes, sauf que System.Timers.Timer a la possibilité d'appeler tous ses rappels d'expiration de la minuterie via ISynchronizeInvoke en définissant Objet de synchronisation. Sinon, les deux minuteurs appellent des rappels d'expiration sur les threads du pool de threads.

Lorsque vous faites glisser un System.Timers.Timer sur une surface de conception Windows Forms, les ensembles Visual Studio Objet de synchronisation à l'objet de formulaire, ce qui provoque l'appel de tous les rappels d'expiration sur le thread d'interface utilisateur.


1
2017-09-09 10:56



De MSDN: System.Threading.Timer est un minuteur simple et léger qui utilise des méthodes de rappel et est servi par les threads du pool de threads. Il n'est pas recommandé d'utiliser Windows Forms, car ses rappels ne se produisent pas sur le thread d'interface utilisateur. System.Windows.Forms.Timer est un meilleur choix pour une utilisation avec Windows Forms. Pour la fonctionnalité de minuterie basée sur le serveur, vous pouvez envisager d'utiliser System.Timers.Timer, qui soulève des événements et a des fonctionnalités supplémentaires.

La source


1
2018-03-29 14:01