Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / desktop / WinForms

Multicast delegates in winform control update

0.00/5 (No votes)
21 Mar 2011CPOL 12.7K  
People wonder how do delegates work and the threading issues associated with multicast ones.
Just to showcase multiple features of delegates in a single function :) This can be used to have a concise feature set of delegates

Problem statement: Using multicast delegates asynchronously to update a winform control using lambda expression

Problem elaboration

  • delegate
    • - that too multicast
      • async invocation
        • winform control update (threading issue)
          • lambda expression


Seems complicated ??

Not so much :) The example illustrates all the features available in delegate usage in .NET 3.5

public void DelegateTest ()
{
    // Create a multicast delegate
    Func<int, int> myDelegate;
    myDelegate = (i) => { return ++i; };
    myDelegate += (i) => { return i; };
    myDelegate += (j) => { return --j; };

    // Define a Action to update the textbox
    Action<int> textboxWrite = (delRes) => { textBox1.Text += "  " + delRes.ToString(); };

    // Iterate over delegates added in multicast delegate,
    // as a multicast delegate cannot be invoked asynchronously
    foreach (var d in myDelegate.GetInvocationList())
    {
        // Cast the abstract delegate reference to our delegate type
        var myDel = d as Func<int, int>;

        // Invoke delegate asynchronously
        myDel.BeginInvoke(0, 
            res =>
            {
                // Get the result of invocation
                var result = myDel.EndInvoke(res);
                // Update the textbox by using BeginInvoke 
                // as control cannot be updated from non-owner thread
                textBox1.BeginInvoke(textboxWrite, new object[] { result });
            }, null);
    }        

    // That's all  ::)
}


Now the internals


  1. A delegate in .NET is multicast since it can hold references to multiple functions . These get added to the internally managed "InvocationList" which is a collection of delegates of the same type. Each function gets executed in sequence of adding.
    • Func and Action are specific delegates
      Func provides a return value
      Action does not provides a return value
      • Lambda expressions are 3.5 feature over previous anonymous functions (2.0 stuff)
        • Updating a winform control from non-owner thread requires a hold of the UI thread, using BeginInvoke. The UI thread is hyper performance intensive, so no other thread is given permission to mingle in its job.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)