Anonymous methods and delegates

Mez picture Mez · Jun 9, 2009 · Viewed 13.9k times · Source

I try to understand why a BeginInvoke method won't accept an anonymous method.

void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    if (InvokeRequired)
    {
        //Won't compile
        BeginInvoke(delegate(object sender, ProgressChangedEventArgs e) 
        { bgWorker_ProgressChanged(sender, e); });
    }

    progressBar1.Increment(e.ProgressPercentage);
}

It tells me 'cannot convert from 'anonymous method' to 'System.Delegate' while when I cast the anonymous method to a delegate it does work ?

BeginInvoke((progressDelegate)delegate { bgWorker_ProgressChanged(sender, e); });

Answer

Marc Gravell picture Marc Gravell · Jun 9, 2009

You need to tell the compiler what type of delegate to create, since Invoke (etc) just take Delegate (rather than something more specific).

To apply to the largest audience, MethodInvoker is a handy delegate type

BeginInvoke((MethodInvoker) delegate(...) {...});

However... BackgroundWorker.ProgressChanged fires on the UI thread automatically - so you don't even need this.