Multicast delegates in winform control update





0/5 (0 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 :) 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
- winform control update (threading issue)
- async invocation
- - that too multicast
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
- 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.
- Lambda expressions are 3.5 feature over previous anonymous functions (2.0 stuff)
- Func and Action are specific delegates
Func provides a return value
Action does not provides a return value