Event erstellen, auslösen und abarbeiten (regulär mit delegat)

// Delegatfunktion für den Event definieren
public delegate void MyHandler(object o, MyEventArgs e);

// Argumente, die beim Auslösen des Events übergeben werden, definieren
public class MyEventArgs : EventArgs
{
    public readonly int iValue;
    
    public MyEventArgs(int val)
    {
        iValue = val;
    }
}

// Klasse, die den Event auslöst
public class MyClass
{
    // Eventhandler
    public event MyHandler MyEvent;

    public int a;
    public int b;

    public int Calc()
    {
        int iRetVal = a + b;

        // wenn Event abgefragt werden soll
        if (MyEvent != null)
        {
            // Event auslösen
            MyEvent(this, new MyEventArgs(iRetVal);
        }

        return iRetVal;
    }       
}

...

// irgendwo im Programm (Formular)
// Objekt der Klasse, die das Event auslöst, definieren
MyClass mc = new MyClass();
// Funktion die beim Auslösen des Events anspricht anmelden
mc.MyEvent += new MyHandler(MyCalcEventhandler);
// etwas rechnen und implizit das Event auslösen
mc.a = 5;
mc.b = 7;
mc.Calc();

// Funktion, die beim Auslösen des Events abgearbeitet wird
void MyCalcEventhandler(object sender, MyEventArgs e)
{
     Console.WriteLine(e.iValue);
}