65.9K
CodeProject is changing. Read more.
Home

Multicast delegates in winform control update

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0 vote)

Mar 21, 2011

CPOL
viewsIcon

12791

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.