Un amico mi ha chiesto se attraverso l'uso delle lambda function è possibile "elegantizzare" il classico codice che si occupa di eseguire il marshaling tra UI e thread secondario. Il codice di partenza è:

void BusDriver_TelegramReceived (BusDriver sender, BusTelegram telegram)
        {
            if (InvokeRequired)
            {
                this.Invoke((TelegramReceived)delegate(BusDriver driver, BusTelegram tgram)
                {
                    BusDriver_TelegramReceived(driver, tgram);
                }, sender, telegram);
            }
            else
                this.Text = sender.Name + " " + telegram.Id.ToString();
        }

Per arrivare al risultato è necessario creare un extension method che aggiunge un nuovo overload al metodo Invoke:

static class ControlExtender
{
    public static void Invoke(this Control control,MethodInvoker lambda) 
  {
        if (control.InvokeRequired)
            control.Invoke(lambda);
        else
            lambda();
  }
}

Fatto questo il codice di partenza si può riscrivere in:

void BusDriver_TelegramReceived (BusDriver sender, BusTelegram telegram)
{
    this.Invoke(()=>this.Text=sender.Name+" "+ telegram.Id);
}

Elegante e, sopratutto, riutilizzabile.