Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Einführung in Delegation, Ereignisse und asynchrone Nutzung in C#

Eine kurze Einführung in Delegation, Ereignisse und asynchrone Nutzung in C#

黄舟
黄舟Original
2017-03-24 11:17:401824Durchsuche

In diesem Artikel werden hauptsächlich die relevanten Kenntnisse zu Delegation, Ereignissen und Asynchronität in C# vorgestellt. Hat einen sehr guten Referenzwert. Werfen wir einen Blick mit dem Editor unten

Es ist fast ein Jahr her, seit ich zum ersten Mal mit der C#-Programmierung in Kontakt kam. Im Lernprozess gibt es viele Dinge, die schon immer paradox waren und die ich bis vor kurzem nicht verstanden habe.

In diesem Artikel wird zunächst die Verwendung vorgestellt und anschließend die Funktion bewertet.

1. Delegierter

Grundlegende Verwendung:

1. Delegaten sind wie „Klassen“. Nachdem Sie einen Delegaten deklariert haben, können Sie mehrere Delegaten mit dieser Eigenschaft erstellen. (Funktionen beziehen sich auf Rückgabewerte und Parametertypen)

public delegate void SomeKindOfDelegate(<a href="http://www.php.cn/wiki/57.html" target=" _blank">string<code>public delegate void SomeKindOfDelegate(<a href="http://www.php.cn/wiki/57.html" target="_blank">string</a> result); result);

2. Erstellen Sie einen Delegaten des in 1 erstellten Delegatentyps.

public SomeKindOfDelegate aDelegate;

3. Fügen Sie die Antwort--Funktion dem in 2 erstellten spezifischen Delegaten hinzu. Die Antwortfunktion muss den „Merkmalen“ in 1 entsprechen.

aDelegate +=new SomeKindOfDelegate(aFunctionThatJustForDelegate);
private void aFunctionThatJustForDelegate(string result)
{
MessageBox.Show(result);
}

4. Nachdem Sie die oben genannten drei Schritte ausgeführt haben, können Sie Invoke verwenden, um den Delegaten anzurufen. Invoke kann die aufzurufende Zielfunktion, die aufrufende -Priorität und die aufrufenden Parameter auswählen.

aDelegate.BeginInvoke("Hello~I'm being invoked!", null, null);

Das Obige ist die grundlegende Verwendung. Zusätzlich zu dieser grundlegenden Verwendung können Sie auch var, anonyme Delegation, Lambda-Delegierung und andere Methoden kombinieren.

Vollständiger Code:

namespace wtfIsDelegate
{
 public delegate void SomeKindOfDelegate(string result);
 public partial class Form1 : Form
 {
  public event SomeKindOfDelegate aDelegate;
  public Form1()
  {
   InitializeComponent();
   aDelegate +=new SomeKindOfDelegate(aFunctionThatJustForDelegate);
   aDelegate.BeginInvoke("Hello~I&#39;m being invoked!", null, null);
  }
  private void btnDelegate_Click(object sender, EventArgs e)
  {
  }
  private void aFunctionThatJustForDelegate(string result)
  {
   MessageBox.Show(result);
  }
 }
}

Verwendung der Delegation:

Der Vorteil der Delegation besteht darin, dass sie asynchron (BeginInvoke) implementieren kann kann auch in einem bestimmten Fall verwendet werden Vereinfachen Sie den Code, wenn mehrere Aufrufe mit denselben Parametern und Rückgabewerten gleichzeitig durchgeführt werden müssen.

2. Ereignisse

Grundlegende Verwendung:

1.

public delegate void SomeKindOfDelegate(string result);

2. Ereignisse definieren.

public event SomeKindOfDelegate aDelegate;

3. Fügen Sie dem Ereignis eine Antwortfunktion hinzu.

process.Exited += new EventHandler(CmdProcess_Exited);

4. Geben Sie die auslösende (aufrufende) Methode für das Ereignis an. ([Sie können auch direkt ohne Auslösung aufrufen])

Erklärung:

In C# entspricht wahrscheinlich jeder Typ von „Ereignis“ seinem „Ereignishandler“. oder EventHandler'. Beispielsweise entspricht das OutputDataReceived-Ereignis der Process-Klasse dem DataReceivedEventHandler. Bei unspezifischen „Ereignissen“ wie „PasswordChanged“ entsprechen sie alle allgemeineren „Ereignishandlern“ wie „RoutedEventHandler“ oder „EventHandler“. Allerdings fungiert „EventHandler“ nur als Vermittler. Was zu tun ist, nachdem das „Event“ tatsächlich ausgelöst wurde, müssen wir noch manuell angeben, etwa so:

process.Exited += new EventHandler(CmdProcess_Exited); // 注册进程结束事件 。

EventHandler ist auch ein Delegat. Beispielsweise ist

public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);

Benutzerdefiniertes Ereignis

Benutzerdefiniertes Ereignis eine Methode ähnlich der Delegation,

selbstdefinierende Ereignisse Ändert in gewisser Weise den Ablauf des Programms, indem es die Änderung einer bestimmten Bedingung von einer „kontinuierlichen Abfrage“ zu einer „Abonnement- und Verarbeitungs“-Beziehung ändert.

Ein benutzerdefiniertes Ereignis erfordert die folgenden Elemente:

Der Initiator des Ereignisses, das Abonnement des Ereignisses und der Handler des Ereignisses. Parameter können vom Initiator an den Handler übergeben werden.

Die „Initiierung“ eines Ereignisses kann von einer Art Systemmeldung abhängen, wie z. B. „OnKeyDown“, „OnMouseClick“ ([Ich habe noch keinen so geschriebenen Quellcode gesehen]) , und Es kann von selbst aufgerufen werden, wenn eine bestimmte Bedingung erfüllt ist (z. B. wird dasselbe Zeichen zweimal eingegeben) (tatsächlich wird der Empfang einer Systemnachricht auch als „Bedingung erfüllt“ betrachtet). [Weitere Ereignisse werden so geschrieben]

Einige Ereignisse haben keinen offensichtlichen „Initiator“.

Welche Beziehung besteht zwischen Delegation und Ereignissen?

Die Verwendung von Delegation und benutzerdefinierten Ereignissen ist sehr ähnlich. Das Ereignis kann nur innerhalb der Klasse aufgerufen werden. Wenn es sich um einen Delegaten handelt, kann es überall aufgerufen werden. Die aufrufende Methode scheint etwas anders zu sein (Parameterübergabemethode)

Aufgrund des Unterschieds in der aufrufenden Methode und der Parameterübergabe scheint das Ereignis konservativer/stabiler zu sein. Ereignisse sind auch leichter zu „verstehen“ und zu akzeptieren.

delegate scheint eher für asynchrone Prozesse (Begin Invoke) verwendet zu werden. Event wird eher für benutzerdefinierte Ereignisse verwendet.

Welche Beziehung besteht zwischen Delegation und Asynchronität?

Asynchron ist eine Funktion, die durch Delegation erreicht werden kann (oder als „Phänomen“ bezeichnet werden kann). auf viele andere Arten, wie zum Beispiel Multithreading (Thread, Threadpool, Task usw.).

Das obige ist der detaillierte Inhalt vonEine kurze Einführung in Delegation, Ereignisse und asynchrone Nutzung in C#. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn