2009-07-25 3 views
1

Je ne suis pas très familier avec VB.NET, donc je ne sais pas si cela est possible ...Accrocher la méthode Application.DoEvents dans VB.NET

Une partie du code, je travaille sur la mise en est propriétés d'une très grande classe. Dans le setter de chaque propriété, un événement est déclenché pour indiquer que les données de classe ont changé. Un gestionnaire d'événements sérialise ensuite l'instance de la classe dans une base de données.

Évidemment, je ne veux pas que cela se produise après que chaque propriété est définie, donc j'ai besoin d'avoir un délai avant d'enregistrer, ou autre chose. Je garde une grande liste d'instances dans une implémentation de cache déjà, donc une option serait de traiter seulement le cache de temps en temps et enregistrer toutes les instances non sauvegardées dans le cache à la base de données.

J'ai donc essayé de voir si je pouvais dériver une classe à partir d'Application (et redéfinir DoEvents), mais c'est NonInheritable, donc pas de chance là-bas.

Des idées?

+0

Votre cas d'utilisation est-il lié aux minuteurs? –

+0

Un événement aura des abonnés qui sont notifiés lorsque l'événement est déclenché. Quand vous dites une file d'attente d'événement, je ne suis pas sûr de comprendre. Si je souscris à l'événement Invalidated de formulaires, puis appelez deux fois la méthode Invalidate. Ensuite, l'événement invalidé sera déclenché deux fois. Donc, dans ce cas, voulez-vous dire que vous voulez avoir un retard, en pensant de façon optimiste qu'il y aura des appels Invalidate subséquents? –

+0

Ok, je pense que je suis confus entre la file d'attente des messages Windows et les événements. – Ries

Répondre

1

Il n'est pas entièrement clair si vous parlez de la pompe de messages Windows ou des événements .NET. Quoi qu'il en soit, il existe quelques approches courantes:

  • de modifier l'éditeur de sorte qu'il ne déclenche qu'un seul événement lorsque tout est fait; par exemple, avec la liaison de données à BindingList<T> vous pouvez définir RaiseListChangedEvents à false tout en faisant une grande mise à jour, puis vrai après et appeler la méthode de réinitialisation
  • dire la cible pour désactiver des choses comme le dessin pendant une durée; par exemple en utilisant un BeginEdit()/EndEdit() paire de méthodes
  • si aucun n'est possible: gérer les événements, mais ne rien faire immédiatement; faites seulement quelque chose une fois que vous croyez que rien d'autre ne vient; par exemple en ajoutant un court délai avant de faire votre funky stuff

Un exemple du dernier est ici: Prevent events from firing multiple times from single action

0

Ajouter un champ supplémentaire à votre classe EventArgs qui dit « manipulé ». Ensuite, chaque gestionnaire vérifie ce champ et continue seulement s'il est faux. Ensuite, une fois que c'est fait, il définit le champ sur True.

0

Il n'y a pas de "file d'attente d'événements". Demandez-vous à ce sujet à cause d'un problème que vous avez vu, ou en raison d'une préoccupation que vous avez? Si vous posez des questions sur un problème, veuillez modifier votre question pour inclure des détails sur le problème. Si vous posez une question, veuillez modifier la question pour inclure des informations sur ce qui vous préoccupe.