Ereignisgesteuertes .NET:So fügen Sie einer Klasse ein Ereignis hinzu

 C Programming >> C-Programmierung >  >> Tags >> .NET
Ereignisgesteuertes .NET:So fügen Sie einer Klasse ein Ereignis hinzu

Im vorherigen Artikel haben wir gesehen, wie Events funktionieren. In diesem Artikel zeige ich, wie man ein Ereignis zu einer Klasse hinzufügt. Um dies zu veranschaulichen, habe ich eine einfache Chat-App erstellt, die eine In-Memory-Nachrichtenwarteschlange verwendet. Jedes Chatfenster wird für das OnMessageReceived-Ereignis der Nachrichtenwarteschlange abonniert und aktualisiert seine Benutzeroberfläche beim Empfang einer Nachricht.

1 – Fügen Sie einen Delegiertentyp hinzu, fügen Sie ein Ereignis hinzu zu einer Klasse hinzufügen und das Ereignis auslösen

  1. Deklarieren Sie den Delegattyp Der Delegattyp wird eigenständig deklariert – er ist nicht Teil einer Klasse.
  2. Ereignis hinzufügen – verwenden Sie den soeben erstellten Delegate-Typ
  3. Das Ereignis auslösen – Das Ereignis ist null, wenn es keine Abonnenten gibt, daher müssen Sie immer eine Nullprüfung durchführen.
public delegate void MessageReceivedEventHandler(Message message); 
//1. declare the delegate type for the event

public class MessageQueue
{
	public event MessageReceivedEventHandler OnMessageReceived; 
//2. Add the event with the delegate type you declared 

	public void Enqueue(Message message)
	{
		OnMessageReceived?.Invoke(message); //3. fire the event
	}
}
Code language: C# (cs)

2 – Abonnieren Sie die Veranstaltung

Das Abonnieren einer Veranstaltung besteht aus zwei Teilen:

  • Abonnieren Sie mit der Syntax:event +=Methode mit derselben Signatur wie der Delegat
  • Abbestellen mit der Syntax:event -=Methode mit derselben Signatur wie der Delegierte
public partial class frmChat : Form
{
	private readonly MessageQueue MessageQueue;
	private readonly Guid UserId;
	public frmChat(MessageQueue messageQueue)
	{
		InitializeComponent();

		UserId = Guid.NewGuid();

		this.MessageQueue = messageQueue;
                //1. subscribe
		this.MessageQueue.OnMessageReceived += MessageQueue_OnMessageReceived; 
	}

	private void MessageQueue_OnMessageReceived(Message message)
	{
		txtChatWindow.AppendText($"{message.Time}\t{message.UserName}\t{message.Msg}\n");
	}

	private void btnSubmit_Click(object sender, EventArgs e)
	{
		MessageQueue.Enqueue(new Message(UserId, txtMessage.Text, txtName.Text));
	}

	private void frmChat_FormClosing(object sender, FormClosingEventArgs e)
	{
                //2. unsubscribe 
		MessageQueue.OnMessageReceived -= MessageQueue_OnMessageReceived; 
	}
}
Code language: C# (cs)