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.