2008-10-10 10 views
5

J'ai une ancienne application WinForms Mdi dans VB.Net 2.0 à laquelle j'ajoute des fonctionnalités. L'un des ajouts est un avertissement qui doit être déclenché lorsque l'heure actuelle s'approche d'une valeur spécifiée (une date limite). Mon intention est de vérifier l'heure une fois par heure jusqu'à ce qu'il y ait moins d'une heure avant la date limite, puis d'afficher des avertissements à des intervalles spécifiés jusqu'à ce que le temps soit écoulé.Quel .Net Timer() utiliser

L'utilisateur doit pouvoir continuer à utiliser l'application jusqu'à et même après la date limite, mais il doit être périodiquement informé de la proximité du délai.

L'application n'utilise pas System.Threading pour l'instant et ma connaissance est limitée pour le moment. Je sais qu'il ya 3 différentes méthodes disponibles (minuterie):

  • System.Threading.Timer(),
  • Windows.Forms.Timer() et
  • System.Timers.Timer()

Ma question est la suivante: quelle est la meilleure façon de procéder? J'ai essayé d'utiliser la minuterie filetée, mais étant donné que WinForms n'est pas sûr pour les threads, j'ai eu une erreur d'exécution essayant d'accéder à une autre classe. Cela vaut-il la peine de sécuriser le thread de classe/formulaire? Suis-je complètement hors piste?

Merci.

+0

Il est possible de faire de la programmation WinForms filetés, btw. Vous avez juste besoin d'attraper si un appel de méthode est fait dans le même thread qu'un formulaire, et si ce n'est pas le cas, envoyez-le au thread approprié. Cela semble plus difficile que ça ne l'est en réalité. –

Répondre

6

Je voudrais simplement utiliser le minuteur Forms. Je pense avoir lu que ce n'est pas aussi précis, mais on dirait que vous n'en avez pas besoin.

+2

le temporisateur de formulaires synchronise automatiquement sur le formulaire, ce qui devrait éliminer les problèmes d'accès de contrôle de fil en tant que bonus –

11

Cet article explique assez bien:

Comparing the Timer Classes in the .NET Framework Class Library

On dirait que System.Windows.Forms.Timer est celui pour vous.

Mon guide: Si vous voulez que le minuteur fonctionne sur votre thread graphique principal, respectez Windows.Forms.Timer. Si votre minuteur peut être appelé de manière asynchrone sur un thread de thread, ou si vous ne voulez pas rencontrer les petits retards que System.Windows.Forms.Timer a tendance à subir, utilisez System.Timers.Timer. System.Threading.Timer a une interface différente des deux autres et n'est pas thread-safe; Personnellement, je ne suis pas fan.

-1

Ok, ... Tout d'abord

Si vous voulez montrer à l'utilisateur une forme et faire quelque chose en arrière-plan, j'utiliser la classe BackgroundWorker, il a travaillé pour moi avant. En outre, vous avez besoin de méthodes invoke comme mentionné précédemment et comme Chris l'a dit, cela semble plus difficile que ce qu'il est réellement.

Voici un lien qui, je pense, vous aidera.
http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx

+1

-1? Quel est le problème avec ma réponse? – sebagomez

0

Le System.Forms.Timer fonctionne réellement sur le thread principal en utilisant la file d'attente de messages Windows. Cela rend un peu inexact mais comme vous n'avez pas vraiment besoin de ms, c'est assez bon. Vous pouvez utiliser l'un des autres temporisateurs qui fonctionnent sur un thread séparé, mais puisque vous devez activer un composant winforms qui fonctionne dans le main, vous devez utiliser Form.Invoke ou un autre moyen de passer l'événement au thread principal - ce qui entraînerait également une certaine latence. En conclusion, utilisez le System.Forms.Timer lorsque vous devez activer un composant Winforms.