Κοινή χρήση τεχνολογίας

Ασύγχρονος προγραμματισμός C# Χρήση και λειτουργία Invoke, startInvoke, endInvoke

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Ασύγχρονος προγραμματισμός C# Χρήση και λειτουργία Invoke, startInvoke, endInvoke

1. Επίκληση

Η ουσία του Invoke είναι απλώς μια μέθοδος και η μέθοδος πρέπει να καλείται μέσω ενός αντικειμένου.

Σε γενικές γραμμές, υπάρχουν μόνο δύο περιπτώσεις όταν το Invoke χρησιμοποιείται πραγματικά:

ControlInvoke

DelegateInvoke

Με άλλα λόγια, του Invoke προηγείται είτε ένα αντικείμενο ελέγχου είτε ένα αντικείμενο αντιπροσώπου.

ControlInvoke

Το Control's Invoke χρησιμοποιείται γενικά για την επίλυση προβλημάτων πρόσβασης μεταξύ νημάτων, για παράδειγμα, εάν θέλετε να χειριστείτε ένα κουμπί, πρέπει να χρησιμοποιήσετε το κουμπί όλοι θα το βρουν πολύ ενοχλητικό, αν θέλω να λειτουργήσω και το κουμπί και την ετικέτα, μπορώ να τα γράψω μαζί; σίγουρος.

Γνωρίζουμε ότι η κύρια φόρμα είναι μια φόρμα και η φόρμα κληρονομεί φυσικά τον έλεγχο, επομένως η Φόρμα έχει επίσης τη μέθοδο Invoke, η οποία μπορεί να καλέσει απευθείας το Form.Invoke. Αυτός είναι ο λόγος που ορισμένα Invokes δεν έχουν τίποτα μπροστά τους Στην πραγματικότητα, υπάρχει αυτό μπροστά τους, αλλά παραλείπεται.

Παράδειγμα:

this.Invoke(new Action(() =>{ button1.Text = "关闭";}));

DelegateInvoke

Το Delegate's Invoke στην πραγματικότητα καλεί τη μέθοδο delegate από το νήμα για εκτέλεση Η Invoke είναι μια σύγχρονη μέθοδος και θα μπλοκάρει το νήμα διεπαφής χρήστη που την καλεί.

  1. void PrintMessage(string message) 
  2.     { 
  3.         Console.WriteLine(message); 
  4.     } 
  5.     MyDelegate myDelegate = PrintMessage; 
  6.     myDelegate.Invoke("Hello, World!"); // 使用 Invoke 方法调用委托引用的方法`

startInvoke, endInvoke

Γνωρίζουμε ήδη ότι το async/wait, η κλάση BackGroudWorker και το TPL (Task Parallel Library) υπάρχουν στη C#. Φυσικά, η C# έχει ακόμα κάποια παλιά μοτίβα για την υποστήριξη του ασύγχρονου προγραμματισμού.

  1.     delegate long MyDel(int first, int second);
  2.     
  3.     class Program
  4.     {
  5.         static long Sum(int x, int y)
  6.         {
  7.             Console.WriteLine("------Inside Sum@{0}", DateTime.Now.ToString());
  8.             Thread.Sleep(2000);
  9.             return x + y;
  10.         }
  11.     
  12.         static void Main(string[] args)
  13.         {
  14.             MyDel del = new MyDel(Sum);
  15.     
  16.             Console.WriteLine("Before BeginInvoke---@{0}", DateTime.Now.ToString());
  17.             IAsyncResult iar = del.BeginInvoke(3, 5, null, null);
  18.             Console.WriteLine("After BeginInvoke@{0}", DateTime.Now.ToString());
  19.     
  20.             Console.WriteLine("Doing stuff@{0}", DateTime.Now.ToString());
  21.     
  22.             long result = del.EndInvoke(iar);
  23.             Console.WriteLine("End Invoke@{0}", DateTime.Now.ToString());
  24.     
  25.             Console.WriteLine("After EndInvoke:  {0}", result);
  26.     
  27.             Console.ReadKey();
  28.     
  29.         }
  30.     }

Ο παραπάνω κώδικας ορίζει έναν πληρεξούσιο MyDel και μεταβιβάζει τη μέθοδο Sum στο αντικείμενο του όταν καλείται. Κανονικά όταν καλούμε αυτό το αντικείμενο αντιπροσώπου, θα καλεί τις μεθόδους που περιλαμβάνονται στη λίστα κλήσεων του. Ακριβώς όπως η κλήση μιας μεθόδου, αυτό γίνεται συγχρονισμένα.

Αλλά εάν το αντικείμενο αντιπροσώπου έχει μόνο μία μέθοδο (μέθοδος αναφοράς) στη λίστα κλήσεων, μπορεί να εκτελέσει αυτήν τη μέθοδο ασύγχρονα. Το BeginInovke και το EndInvoke χρησιμοποιούνται για να γίνει αυτό. Μπορούμε να το χρησιμοποιήσουμε με τον εξής τρόπο:

* ① Όταν καλούμε τη μέθοδο BeginInvoke, αρχίζει να εκτελεί τη μέθοδο αναφοράς σε ένα ανεξάρτητο νήμα και αμέσως επιστρέφει στο αρχικό νήμα. Το αρχικό νήμα μπορεί να συνεχιστεί και η μέθοδος αναφοράς θα εκτελεστεί παράλληλα στο επιθυμητό νήμα.
* ② Όταν το πρόγραμμα θέλει να λάβει το αποτέλεσμα της ολοκληρωμένης ασύγχρονης μεθόδου, μπορεί να ελέγξει την ιδιότητα IsCompleted του IAsyncResult που επιστράφηκε από το BeginInvoke ή να καλέσει τη μέθοδο EndInvoke του πληρεξούσιου για να περιμένει την ολοκλήρωση της εκτέλεσης εκπροσώπου.

Η παραπάνω διαδικασία χρήσης οδηγεί σε τρεις τρόπους:

* ①Περιμένετε μέχρι την ολοκλήρωση Αφού το αρχικό νήμα ξεκινήσει την ασύγχρονη μέθοδο και κάνει κάποια άλλη επεξεργασία, το αρχικό νήμα διακόπτει και περιμένει να ολοκληρωθεί η ασύγχρονη μέθοδος πριν συνεχίσει.

* ②Σε ψηφοφορία, το αρχικό νήμα ελέγχει τακτικά εάν το νήμα που ξεκίνησε έχει ολοκληρωθεί, εάν όχι, μπορεί να συνεχίσει να κάνει άλλα πράγματα.

* ③ Το αρχικό νήμα της επανάκλησης εκτελείται πάντα χωρίς να αναμένει ή να ελεγχθεί εάν το νήμα εκκίνησης έχει ολοκληρωθεί. της ασύγχρονης μεθόδου πριν καλέσετε το EndInvoke.

Ιστότοπος αναφοράς:

Λεπτομερής επεξήγηση της πρακτικής εφαρμογής των Invoke και BeginInvoke στο C#_C# Tutorial_Script Home

Χρήση του αντιπροσώπου του νήματος C# BeginInvoke και EndInvoke_C# Tutorial_Script Αρχική σελίδα