2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Das Wesentliche von Invoke ist nur eine Methode, und die Methode muss über ein Objekt aufgerufen werden.
Im Allgemeinen gibt es nur zwei Situationen, in denen Invoke tatsächlich verwendet wird:
ControlInvoke
DelegateInvoke
Mit anderen Worten: Vor Invoke steht entweder ein Steuerelement oder ein Delegate-Objekt.
Controls Invoke wird im Allgemeinen verwendet, um Thread-übergreifende Zugriffsprobleme zu lösen. Wenn Sie beispielsweise eine Schaltfläche bedienen möchten, müssen Sie button.Invoke verwenden Jeder wird es sehr mühsam finden. Wenn ich sowohl den Knopf als auch das Etikett betätigen möchte, kann ich sie dann zusammen schreiben? Sicher.
Wir wissen, dass das Hauptformular ein Formular ist und das Formular natürlich die Kontrolle erbt. Daher verfügt das Formular auch über die Invoke-Methode, die Form.Invoke direkt aufrufen kann. Dies ist unser gemeinsames this.Invoke. Aus diesem Grund steht vor manchen Invokes nichts. Tatsächlich steht dies davor, aber es wird weggelassen.
Beispiel:
this.Invoke(new Action(() =>{ button1.Text = "关闭";}));
Invoke von Delegate ruft tatsächlich die Delegate-Methode zur Ausführung aus dem Thread-Pool auf und blockiert den UI-Thread, der sie aufruft.
- void PrintMessage(string message)
- {
- Console.WriteLine(message);
- }
- MyDelegate myDelegate = PrintMessage;
- myDelegate.Invoke("Hello, World!"); // 使用 Invoke 方法调用委托引用的方法`
Wir wissen bereits, dass async/await, die BackGroudWorker-Klasse und TPL (Task Parallel Library) in C# existieren. Natürlich verfügt C# noch über einige alte Muster zur Unterstützung der asynchronen Programmierung.
- 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();
-
- }
- }
Der obige Code definiert einen Delegaten MyDel und übergibt beim Aufruf die Sum-Methode an sein Objekt. Wenn wir dieses Delegate-Objekt aufrufen, ruft es normalerweise die in seiner Aufrufliste enthaltenen Methoden auf. Dies erfolgt, genau wie der Aufruf einer Methode, synchron.
Wenn das Delegate-Objekt jedoch nur eine Methode (Referenzmethode) in der Aufrufliste hat, kann es diese Methode asynchron ausführen. Hierzu werden BeginInovke und EndInvoke verwendet. Wir können es auf folgende Weise verwenden:
* ① Wenn wir die BeginInvoke-Methode aufrufen, beginnt sie mit der Ausführung der Referenzmethode in einem unabhängigen Thread und kehrt sofort zum ursprünglichen Thread zurück. Der ursprüngliche Thread kann fortgesetzt werden und die Referenzmethode wird parallel im gewünschten Thread ausgeführt.
* ② Wenn das Programm das Ergebnis der abgeschlossenen asynchronen Methode erhalten möchte, kann es die IsCompleted-Eigenschaft des von BeginInvoke zurückgegebenen IAsyncResult überprüfen oder die EndInvoke-Methode des Delegaten aufrufen, um auf den Abschluss der Delegate-Ausführung zu warten.
Der obige Nutzungsprozess führt zu drei Modi:
* ①Warten bis zum Abschluss. Nachdem der ursprüngliche Thread die asynchrone Methode initiiert und eine andere Verarbeitung durchführt, unterbricht der ursprüngliche Thread und wartet auf den Abschluss der asynchronen Methode, bevor er fortfährt.
* ②Abfrage: Der ursprüngliche Thread prüft regelmäßig, ob der initiierte Thread abgeschlossen ist. Wenn nicht, kann er mit anderen Aufgaben fortfahren.
* ③ Der ursprüngliche Thread des Rückrufs wird immer ausgeführt, ohne zu warten oder zu prüfen, ob der initiierende Thread abgeschlossen ist. Nachdem die Referenzausgabe im initiierenden Thread abgeschlossen ist, ruft der initiierende Thread die Rückrufmethode auf und die Rückrufmethode verarbeitet das Ergebnis der asynchronen Methode vor dem Aufruf von EndInvoke.
Verwendung der C#-Thread-Delegaten BeginInvoke und EndInvoke_C# Tutorial_Script Home