2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
L'essence d'Invoke n'est qu'une méthode, et la méthode doit être appelée via un objet.
De manière générale, il n'y a que deux situations dans lesquelles Invoke est réellement utilisé :
ContrôleInvoquer
DéléguéInvoquer
En d’autres termes, Invoke est précédé soit d’un contrôle, soit d’un objet délégué.
L'Invoke de Control est généralement utilisé pour résoudre les problèmes d'accès entre threads. Par exemple, si vous souhaitez utiliser un bouton, vous devez utiliser button.Invoke. Si vous souhaitez utiliser une étiquette de texte, vous devez utiliser label.Invoke. tout le monde trouvera cela très gênant, si je veux utiliser à la fois le bouton et l'étiquette, puis-je les écrire ensemble ? bien sûr.
Nous savons que le formulaire principal est un formulaire et que Form hérite naturellement de Control, donc Form a également la méthode Invoke, qui peut appeler directement Form.Invoke. C'est notre this.Invoke commun. C'est pourquoi certains Invokes n'ont rien devant eux. En fait, il y a ceci devant eux, mais il est omis.
Exemple:
this.Invoke(new Action(() =>{ button1.Text = "关闭";}));
L'invoke du délégué appelle en fait la méthode déléguée à partir du pool de threads pour l'exécution. Invoke est une méthode synchrone et bloquera le thread de l'interface utilisateur qui l'appelle.
- void PrintMessage(string message)
- {
- Console.WriteLine(message);
- }
- MyDelegate myDelegate = PrintMessage;
- myDelegate.Invoke("Hello, World!"); // 使用 Invoke 方法调用委托引用的方法`
Nous savons déjà que async/await, la classe BackGroudWorker et TPL (Task Parallel Library) existent en C#. Bien entendu, C# possède encore d’anciens modèles pour prendre en charge la programmation asynchrone.
- delegate long MyDel(int first, int second);
-
- class Program
- {
- static long Sum(int x, int y)
- {
- Console.WriteLine("------Inside Sum@{0}", DateTime.Now.ToString());
- Thread.Sleep(2000);
- return x + y;
- }
-
- static void Main(string[] args)
- {
- MyDel del = new MyDel(Sum);
-
- Console.WriteLine("Before BeginInvoke---@{0}", DateTime.Now.ToString());
- IAsyncResult iar = del.BeginInvoke(3, 5, null, null);
- Console.WriteLine("After BeginInvoke@{0}", DateTime.Now.ToString());
-
- Console.WriteLine("Doing stuff@{0}", DateTime.Now.ToString());
-
- long result = del.EndInvoke(iar);
- Console.WriteLine("End Invoke@{0}", DateTime.Now.ToString());
-
- Console.WriteLine("After EndInvoke: {0}", result);
-
- Console.ReadKey();
-
- }
- }
Le code ci-dessus définit un délégué MyDel et transmet la méthode Sum à son objet lorsqu'il est appelé. Normalement, lorsque nous appelons cet objet délégué, il appellera les méthodes incluses dans sa liste d'appels. Tout comme l’appel d’une méthode, cela se fait de manière synchrone.
Mais si l'objet délégué n'a qu'une seule méthode (méthode de référence) dans la liste d'appels, il peut exécuter cette méthode de manière asynchrone. BeginInovke et EndInvoke sont utilisés pour ce faire. Nous pouvons l'utiliser de la manière suivante :
* ① Lorsque nous appelons la méthode BeginInvoke, elle commence à exécuter la méthode de référence sur un thread indépendant et revient immédiatement au thread d'origine. Le thread d'origine peut continuer et la méthode de référence sera exécutée en parallèle dans le thread souhaité.
* ② Lorsque le programme souhaite obtenir le résultat de la méthode asynchrone terminée, il peut vérifier la propriété IsCompleted du IAsyncResult renvoyée par BeginInvoke, ou appeler la méthode EndInvoke du délégué pour attendre la fin de l'exécution du délégué.
Le processus d'utilisation ci-dessus conduit à trois modes :
* ①Attendez la fin.Une fois que le thread d'origine a lancé la méthode asynchrone et effectué un autre traitement, le thread d'origine s'interrompt et attend la fin de la méthode asynchrone avant de continuer.
* ②Polling, le fil d'origine vérifie régulièrement si le fil lancé est terminé. Sinon, il peut continuer à faire autre chose.
* ③ Le thread d'origine du rappel est toujours exécuté sans attendre ni vérifier si le thread initiateur est terminé. Une fois l'émission de référence dans le thread initiateur terminée, le thread initiateur appellera la méthode de rappel et la méthode de rappel traitera le résultat. de la méthode asynchrone avant d'appeler EndInvoke.
Utilisation du délégué de thread C# BeginInvoke et EndInvoke_C# Tutorial_Script Accueil