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 traitez l'événement sur une instance autre que "this").
Cela place l'invocation dans la boucle Windows-forms, de sorte qu'elle est traitée lorsque le formulaire traite la file d'attente des messages.
[mis à jour sur demande]
Les méthodes Control.Invoke/Control.BeginInvoke sont destinées à être utilisées avec le threading et constituent un mécanisme permettant de pousser le travail sur le thread de l'interface utilisateur. Normalement, cette méthode est utilisée par les threads de travail, etc. Control.Invoke effectue un appel synchrone, alors que Control.BeginInvoke effectue un appel asynchrone.
Normalement, ils sont 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 des messages de Windows ; le thread de l'interface utilisateur (à un moment donné) retire le message de la file d'attente, traite le délégué, et signale au travailleur qu'il a terminé... jusqu'ici tout va bien ;-p
OK ; alors que se passe-t-il si nous utilisons Control.Invoke / Control.BeginInvoke sur le thread UI ? Il s'en sort... si vous appelez Control.Invoke, il est suffisamment intelligent pour savoir que le blocage sur la file d'attente des messages provoquerait un blocage immédiat - donc si vous êtes déjà sur le thread UI, il exécute simplement le code immédiatement... donc cela ne nous aide pas...
Mais Control.BeginInvoke fonctionne différemment : il toujours pousse le travail dans la file d'attente, même si nous sommes déjà sur le fil de l'interface utilisateur. C'est une façon très simple de dire "dans un moment", mais sans l'inconvénient des minuteries, etc (qui devraient toujours faire la même chose de toute façon !)
1 votes
Bien que cette question ait de très bonnes réponses, il serait bon de mentionner ceci : docs.microsoft.com/fr/us/dotnet/framework/winforms/