Invoquer et BeginInvoke
Salutations,
Je développe une application en C#. Pour le moment, je m'occupe avec filetage, et j'ai une question que j'ai dans mon esprit.
Quelle est la différence entre les Invoquer et de BeginInvoke?
J'ai lu un thread et j'ai trouvé quelques informations utiles ici: ici
Cependant quelle est la différence entre les Invoquer et de BeginInvoke dans le code suivant:
private void ProcessRoutine()
{
for (int nValue = StartFrom; nValue <= EndTo; nValue++)
{
this.Invoke(this.MyDelegate, nValue);
//this.BeginInvoke(this.MyDelegate, nValue);
}
MessageBox.Show("Counting complete!");
}
private void MessageHandler(int progress)
{
lblStatus.Text = lblStatus.Text = "Processing item: " + progress.ToString();
progressBar1.Value = progress;
}
où MyDelegate est une référence à MessageHandler fonction.
J'ai remarqué que l'utilisation de BeginInvoke lblStatus.Le texte n'est pas actualisé où l'utilisation d'Invoquer rafraîchit l'étiquette.
En outre, je sais qui Appeler attend son exécution complète.
La plus importante affaire qui m'intéresse c'est pourquoi il y a une différence dans le renouvellement de texte de l'étiquette dans ce cas.
OriginalL'auteur Piotr Ptak | 2009-12-15
Vous devez vous connecter pour publier un commentaire.
À Appeler la méthode est exécutée et l'application attend pour la mener à bien.
Avec BeginInvoke la méthode est invoquée Asychnronously et la demande continue de s'exécuter alors que la méthode référencée dans BeginInvoke est exécutée.
Avec BeginInvoke vous devez appeler EndInvoke pour obtenir les résultats de la méthode exécutée à l'aide de BeginIvnoke.
Vous ne devriez pas de mise à jour de composants GUI dans les méthodes BeginXXX comme ils sont exécutés dans un autre thread, le thread GUI, contrairement à votre méthode Invoke. Vous ne pouvez pas accéder composants GUI dans un thread différent du thread GUI.
Espérons que cette aide!
donc, si ce n'est pas dans un autre thread, comment ça fonctionne?
À partir de MSDN: "Exécute la spécifié délégué de façon asynchrone sur le thread que le contrôle sous-jacent de la poignée a été créé". Donc, si il est appelé par le thread de l'INTERFACE utilisateur, il sera placé dans une file d'attente d'exécution lorsque le thread d'INTERFACE utilisateur au repos. Qui sera après la méthode d'exécution actuelle est de retour.
"Vous ne devriez pas de mise à jour de composants GUI dans les méthodes BeginXXX comme ils sont exécutés dans un autre thread, le thread GUI, contrairement à votre méthode Invoke." C'est faux et il devrait être corrigé comme il peut être trompeur pour d'autres (et en plus, c'est la réponse...).
OriginalL'auteur
Pour commencer, à partir de votre lien:
Control.Invoke
: Exécute sur le thread de l'INTERFACE utilisateur, mais thread appelant attend l'achèvement avant de continuer.Control.BeginInvoke
: Exécute sur l'asynchrone thread d'INTERFACE utilisateur, et le thread appelant ne pas attendre la fin.et à partir de MSDN:
Pour résumer,
BeginInvoke
est asynchrone. LorsqueBeginInvoke
est appelé à partir de la thread de l'INTERFACE utilisateur, la requête sera exécutée en parallèle avec le thread d'INTERFACE utilisateur. Ce qui signifie qu'il ne peut exécuter jusqu'à ce que après la méthode d'exécution actuelle est de retour. Donc dans ce cas la zone de texte n'apparaîtra jamais à mettre à jour parce que la boucle ne sera pas interrompu, que le thread appelant à ne pas attendre pour que l'événement soit terminé avant de continuer.Sinon,
Invoke
est synchrone. La zone de texte sera mis à jour parce que le thread attendre l'appel se termine avant de continuer l'exécution.Merci pour vos commentaires; je viens de mettre à jour ma réponse.
OriginalL'auteur
Control.BeginInvoke
ne fonctionne pas sur un autre thread (ou pool de threads), d'un délégué.BeginInvoke. MSDN est un liner dit:Cependant
Control.BeginInvoke
utilise simplement PostMessage et retourne - pas de CLRThread
est créé.Cet article résume si l'utilisation de
Invoke
ouBeginInvoke
assez bien:OriginalL'auteur
BeginInvoke exécute le corps de la méthode sur un autre thread et permet au thread en cours pour continuer. Si vous essayez de mettre à jour directement une propriété de contrôle à partir d'un autre thread, il va lever une exception.
voir la deuxième phrase de ma réponse
OriginalL'auteur
En fait cela se résume à savoir si ou non vous souhaitez que le contrôle pour être mis à jour de manière synchrone ou asynchrone. Tout cela dépend de votre situation spécifique.
OriginalL'auteur