Maison  >  Article  >  développement back-end  >  Explication détaillée de la différence entre C# Invoke et BeginInvoke

Explication détaillée de la différence entre C# Invoke et BeginInvoke

零下一度
零下一度original
2017-06-28 15:38:211897parcourir

La méthode BeginInvoke ouvre-t-elle réellement un nouveau thread pour les appels asynchrones ?

Référez-vous au code suivant :

public délégué void treeinvoke();private void UpdateTreeView()
{
MessageBox.Show(System.Threading.Thread.CurrentThread.Name );
}bouton vide privé1_Click (expéditeur de l'objet, System.EventArgs e)
{
System.Threading.Thread.CurrentThread.Name = "UIThread";
treeView1.BeginInvoke(new treeinvoke(UpdateTreeView) )) ;
}

Regardez les résultats en cours d'exécution. La boîte de dialogue contextuelle affiche UIThread, qui montre que le délégué appelé par BeginInvoke est essentiellement exécuté dans le thread de l'interface utilisateur.

Puisqu'il est exécuté dans le thread de l'interface utilisateur, comment peut-on l'appeler « exécution asynchrone » ?

Regardons à nouveau le code suivant :

public délégué void treeinvoke();private void UpdateTreeView()
{
MessageBox.Show(Thread.CurrentThread.Name);
}bouton vide privé1_Click (expéditeur d'objet, System.EventArgs e)
{
Thread.CurrentThread.Name = "UIThread";
Thread th = new Thread(new ThreadStart(StartThread));
th.Start();
}private void StartThread()
{
Thread.CurrentThread.Name = "Work Thread";
treeView1.BeginInvoke(new treeinvoke(UpdateTreeView));
>

Regardez les résultats en cours d'exécution. La boîte de dialogue contextuelle affiche toujours UIThread. Cela montre que le délégué appelé par la méthode BeginInvoke est de toute façon exécuté dans le thread de l'interface utilisateur.

Alors à quoi sert BeginInvoke ?

En programmation multi-thread, nous devons souvent mettre à jour l'affichage de l'interface dans le thread de travail, et il est erroné d'appeler directement le contrôle d'interface en multi-thread. Les raisons spécifiques peuvent être trouvées dans mon article Après. l'article, lisez cet article : Comment appeler Winform en multi-threads. Si vous êtes un expert, ne lisez pas mon article. Quoi qu'il en soit, je n'ai pas très bien compris cet article.

Invoke et BeginInvoke semblent résoudre ce problème, vous permettant de mettre à jour en toute sécurité l'affichage de l'interface en multi-threads.

L'approche correcte consiste à encapsuler le code impliqué dans la mise à jour de l'interface dans le thread de travail dans une méthode et à l'appeler via Invoke ou BeginInvoke. La différence entre les deux est que l'une fait attendre le thread de travail, tandis que. l'autre non.

La soi-disant "réponse aux opérations lors de l'ajout de nœuds" ne peut être que relative, de sorte que la charge sur le thread de l'interface utilisateur ne soit pas trop importante, car la mise à jour correcte de l'interface doit toujours être effectuée via le Thread d'interface utilisateur. Ce que nous devons faire est de reprendre la plupart des calculs dans le thread de travail et de mettre des mises à jour d'interface pures dans le thread d'interface utilisateur, atteignant ainsi l'objectif de réduire la charge sur le thread d'interface utilisateur.

Dans le code qui met à jour le nœud de l'arborescence, le seul code qui fonctionne réellement est : System.Threading.Thread.Sleep(100);, qui donne au thread de l'interface utilisateur la possibilité de traiter les messages de l'interface. Digital Ghost complique le problème, à condition que le code suivant fonctionne correctement.

bouton d'annulation privé1_Click_(expéditeur d'objet, System.EventArgs e)
{
TreeNode tn; for(int i=0;i<100000;i++)
{
tn= new TreeNode (i.ToString()); this.treeView1.Nodes[0].Nodes.Add(tn); if (i%100 == 0) Application.DoEvents();
}
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn