Voulez-vous dire Delegate.Invoke
/ BeginInvoke
o Control.Invoke
/ BeginInvoke
?
-
Delegate.Invoke
: S'exécute de manière synchrone, sur le même thread.
-
Delegate.BeginInvoke
: S'exécute de manière asynchrone, sur un threadpool
fil.
-
Control.Invoke
: S'exécute sur le thread de l'interface utilisateur, mais le thread appelant attend l'achèvement avant de continuer.
-
Control.BeginInvoke
: S'exécute sur le thread de l'interface utilisateur, et le thread appelant n'attend pas l'achèvement.
La réponse de Tim mentionne les cas où vous pourriez vouloir utiliser BeginInvoke
- même s'il était surtout destiné à Delegate.BeginInvoke
Je le soupçonne.
Pour les applications Windows Forms, je suggérerais que vous devriez généralement utilice BeginInvoke
. De cette façon, vous n'avez pas à vous soucier des blocages, par exemple - mais vous devez comprendre que l'interface utilisateur peut ne pas avoir été mise à jour au moment où vous la regarderez la prochaine fois ! En particulier, vous ne devez pas modifier les données que le thread de l'interface utilisateur pourrait être sur le point d'utiliser pour l'affichage. Par exemple, si vous avez un Person
con FirstName
y LastName
propriétés, et vous l'avez fait :
person.FirstName = "Kevin"; // person is a shared reference
person.LastName = "Spacey";
control.BeginInvoke(UpdateName);
person.FirstName = "Keyser";
person.LastName = "Soze";
Dans ce cas, l'interface utilisateur pourrait bien finir par afficher "Keyser Spacey" (il y a une petite chance qu'elle puisse afficher "Kevin Soze", mais seulement à cause de la bizarrerie du modèle de mémoire).
A moins que vous n'ayez ce genre de problème, cependant, Control.BeginInvoke
est plus facile à mettre en œuvre, et évitera à votre thread d'arrière-plan de devoir attendre sans raison valable. Notez que l'équipe de Windows Forms a garanti que vous pouvez utiliser la fonction Control.BeginInvoke
d'une manière "feu et oublie" - c'est-à-dire sans jamais appeler EndInvoke
. Ce n'est pas vrai pour les appels asynchrones en général : normalement, chaque BeginXXX doit avoir un appel EndXXX correspondant, généralement dans le callback.
0 votes
La déclaration devrait être : - Note : Les deux
ref
yout
traité de la même manière au moment de la compilation, mais différent au moment de l'exécution.