Implementare eventi personalizzati in .NET

Salve a tutti,
oggi vi vorrei parlare della creazione di eventi personalizzati in .NET. Il framework .NET mette a disposizione degli oggetti che permetto in modo semplice la creazione e l’utilizzo di specifici eventi.

Gli eventi consentono a un oggetto ( o classe) di notificare altre classi o altri oggetti quando si verifica una certa occorrenza. La classe che genera ed invia l’evento è chiamata Publisher e le classi che sono notificate e gestiscono l’evento sono chiamate Subscriber. Un evento può avere Subscriber multipli, e i Subscriber possono gestire eventi multipli da Publisher diversi. Gli eventi che non hanno Subscriber non verranno mai richiamati.

In un’applicazione ASP.NET, o Windows Form, solitamente si sottoscrivono eventi generati da controlli quali pulsanti, dialogBox e altri strumenti di input. Gli eventi sono inoltre molto utili per la sincronizzazione di Thread.

Supponiamo di voler implementare un nostro evento in modo che, ad una determinata occorrenza, il Publisher invii un DataSet a tutti i Subscriber in ascolto. Il primo passo per la costruzione di un evento è la definizione di un Delegate in un namespace.

1

public delegate void ProofEventHandler(object source, DataSet ds_example);

I delegate sono tipi di riferimento che derivano dalla classe System.Delegate. L’applicazione definisce l’indirizzo di un metodo che deve essere invocato. La notifica avviene chiamando il metodo così segnalato.
La parola chiave “delegate” viene utilizzata quando si dichiara un metodo che rappresenta il prototipo per i metodi che verranno richiamati. Questo è necessario in quanto in .NET il return type e i parametri del metodo di callback devono essere definiti durante la compilazione per evitare gli errori in fase di runtime.

Implementiamo ora nella classe Publisher (utilizziamo un classe Windows Form con un pulsante “Button1″) un evento che faccia riferimento al delegate precedentemente creato, e lanciamo poi l’evento creato alla pressione del tasto Button1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

public partial class PublClass : Form
{
public event ProofEventHandler proofEvent;
DataSet ds_orig;
...
...

public PublClass(){
ds_orig = new DataSet();
}

public void button1_Click(object sender, EventArgs e)
{
if (proofEvent != null)
{
proofEvent(this, ds_orig);
}
}

...
...

}

Supponiamo ora di voler registrare una classe Subscriber alla notifica dell’evento proofEvent.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

public class SubscribClass
{
DataSet ds;

...
...

public SubscribClass(){
PublClass publisher = new PublClass();

//Event Registration
publisher.proofEvent += new ProofEventHandler(handle_proofEvent);
publisher.ShowDialog();
}

void handle_proofEvent(object source, DataSet ds_received)
{
ds = ds_received;
Console.WriteLine("Event catched!!!");
}

...
...

}

Una volta che verrà premuto il pulsante Button1 nella Form PublClass, la classe SubscribClass intercetterà
l’evento, e richiamerà il metodo “handle_proofEvent”. Con tale metodo la classe SubscribClass acquisirà il
DataSet spedito tramite l’evento proofEvent.