J'utilise parfois (en charge)
this.BeginInvoke((MethodInvoker) delegate {
// some code
});
ou
this.BeginInvoke((MethodInvoker) this.SomeMethod);
(remplacez "this" par votre variable de formulaire si vous gérez l'événement sur une instance autre que "this").
Cela pousse l'appel sur la boucle windows-forms, de sorte qu'il est traité lorsque le formulaire traite la file d'attente de messages.
[mis à jour sur demande]
Les méthodes Control.Invoke / Control.BeginInvoke sont destinées à être utilisées avec le threading et sont un mécanisme pour pousser le travail sur le thread d'interface utilisateur. Normalement, cela est utilisé par les threads de travail, etc. Control.Invoke effectue un appel synchrone, alors que Control.BeginInvoke effectue un appel asynchrone.
Normalement, ceux-ci seraient utilisés comme:
SomeCodeOrEventHandlerOnAWorkerThread()
{
// this code running on a worker thread...
string newText = ExpensiveMethod(); // perhaps a DB/web call
// now ask the UI thread to update itself
this.Invoke((MethodInvoker) delegate {
// this code runs on the UI thread!
this.Text = newText;
});
}
Il le fait en poussant un message dans la file d'attente de messages Windows; le thread de l'interface utilisateur (à un moment donné) met le message en file d'attente, traite le délégué et signale au travailleur qu'il s'est terminé ... jusqu'à présent tout va bien ;-p
D'ACCORD; alors que se passe-t-il si nous utilisons Control.Invoke / Control.BeginInvoke sur le thread d'interface utilisateur? Il fait face ... si vous appelez Control.Invoke, il est assez judicieux de savoir que le blocage de la file d'attente de messages entraînerait un blocage immédiat - donc si vous êtes déjà sur le thread de l'interface utilisateur, il exécute simplement le code immédiatement ... de sorte que ne nous aide pas ...
Mais Control.BeginInvoke fonctionne différemment: il pousse toujours le travail dans la file d'attente, même si nous sommes déjà sur le thread de l'interface utilisateur. Cela fait une façon vraiment simple de dire "dans un instant", mais sans les inconvénients des minuteries, etc. (qui devraient quand même faire la même chose de toute façon!).