J'ai fait un composant détectant la présence du réseau, car la classe NetworkChange était trop limitée pour les besoins d'un client. Ce composant émet périodiquement des pings vers un serveur pour détecter sa disponibilité. Lorsque le serveur devient accessible ou inaccessible, un événement est levé.
Le problème, c'est que si je lève simplement l'événement en appelant le (tableau de) délégué(s) correspondant, le gestionnaire d'événements est appelé par le thread de travail qui fait les pings. Or, en Windows Forms, je n'ai pas le droit de mettre à jour un contrôle avec un thread autre que celui qui est affecté à ce contrôle.
Plutôt qu'un long discours, voici le code qui détecte le fait que le gestionnaire d'événements est au sein d'un contrôle, et invoque le gestionnaire d'événements avec le thread du contrôle le cas échéant:
Le problème, c'est que si je lève simplement l'événement en appelant le (tableau de) délégué(s) correspondant, le gestionnaire d'événements est appelé par le thread de travail qui fait les pings. Or, en Windows Forms, je n'ai pas le droit de mettre à jour un contrôle avec un thread autre que celui qui est affecté à ce contrôle.
Plutôt qu'un long discours, voici le code qui détecte le fait que le gestionnaire d'événements est au sein d'un contrôle, et invoque le gestionnaire d'événements avec le thread du contrôle le cas échéant:
if (ServerAvailabilityChanged != null)
{
foreach (ServerAvailabilityChangedEventHandler targetHandler in ServerAvailabilityChanged.GetInvocationList())
{
if (targetHandler.Target is Control)
{
((Control)targetHandler.Target).Invoke(targetHandler, new object[] { this, e });
}
else
{
targetHandler(this, e);
}
}
}
Comments