Click here to Skip to main content
Click here to Skip to main content
Go to top

Multicast delegates in winform control update

, 21 Mar 2011
Rate this:
Please Sign up or sign in to vote.
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 Smile | :) 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 Smile | :) 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)

Share

About the Author

NitinSingh
Software Developer
India India
I am a solutions developer working on .NET for about 10 years, focussing on core framework implementations in project. My development interests are in middle tier and backend components and sometimes, identifying design elements for technical solutions. Apart, I collect coins and stamps and do photography whenever I get a chance.

You may also be interested in...

Comments and Discussions

 
GeneralGood Post Nitin Keep posting . Pinmemberykg24-Mar-11 0:42 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web04 | 2.8.140926.1 | Last Updated 21 Mar 2011
Article Copyright 2011 by NitinSingh
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid