<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Quantum Bit Designs &#187; Events</title>
	<atom:link href="http://blog.quantumbitdesigns.com/tag/events/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.quantumbitdesigns.com</link>
	<description>Multithreading, WPF, .NET and Software Designs</description>
	<lastBuildDate>Tue, 26 Jan 2010 15:17:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Events and Threads</title>
		<link>http://blog.quantumbitdesigns.com/2008/07/22/events-and-threads/</link>
		<comments>http://blog.quantumbitdesigns.com/2008/07/22/events-and-threads/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 03:36:52 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Multithreading]]></category>
		<category><![CDATA[DelegateMarshaler]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[Threads]]></category>

		<guid isPermaLink="false">http://blog.quantumbitdesigns.com/?p=27</guid>
		<description><![CDATA[The purpose of this post is to provide not only a reference for events and multithreading, but also as a background for the fix to the ThreadBarrier pattern I previously introduced. The original ThreadBarrier implementation has a flaw (Problem #2 below). Rather than just posting the fix and not describing the problem in detail, I [...]]]></description>
			<content:encoded><![CDATA[<p><!--StartFragment -->The purpose of this post is to provide not only a reference for events and multithreading, but also as a background for the fix to the <a href="http://blog.quantumbitdesigns.com/2008/06/10/stop-polluting-the-ui-thread-use-a-threadbarrier/">ThreadBarrier pattern</a> I previously introduced. The original ThreadBarrier implementation has a flaw (Problem #2 below). Rather than just posting the fix and not describing the problem in detail, I think it is better to provide an analysis and thorough investigation into the bug so that we all can learn together about the subtleties involved in multithreading. Remember: <a href="http://www.randomtree.org/eric/techblog/2004/10/multithreading-is-hard.html">multithreading is hard</a>. Tomorrow I will revisit the ThreadBarrier pattern with the fix as well as new ideas on how to use it. Until then, the following post shows several solutions to various problems with events and multithreading. I can&#8217;t take credit for all of it; most of it has been covered already <a href="http://davebrooks.wordpress.com/2007/02/07/threading-through-the-open-window-of-opportunity/">here</a>, <a href="http://code.logos.com/blog/2008/05/events_and_threads_part_3.html">here</a>, and <a href="http://rodenbaugh.net/post/Defensive-Event-Publishing.aspx">here</a>.</p>
<p><big style="font-weight: bold"><big>Problem #1: Race condition while raising event</big></big></p>
<p>As long as your class is not intended to be thread-safe, it is best to implement events using the following well known pattern:</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 private\cf0  \cf3 event\cf0  \cf4 EventHandler\cf0  MyEvent;\par ??\par ??        \cf3 protected\cf0  \cf3 virtual\cf0  \cf3 void\cf0  OnMyEvent(\cf4 EventArgs\cf0  e)\par ??        \{\par ??            \cf3 if\cf0  (MyEvent != \cf3 null\cf0 )\par ??            \{\par ??                MyEvent(\cf3 this\cf0 , e);\par ??            \}\par ??        \}} --></p>
<p style="margin: 0px">        <span style="color: blue">private</span> <span style="color: blue">event</span> <span style="color: #2b91af">EventHandler</span> MyEvent;</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">        <span style="color: blue">protected</span> <span style="color: blue">virtual</span> <span style="color: blue">void</span> OnMyEvent(<span style="color: #2b91af">EventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">if</span> (MyEvent != <span style="color: blue">null</span>)</p>
<p style="margin: 0px">            {</p>
<p style="margin: 0px">                MyEvent(<span style="color: blue">this</span>, e);</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">        }</p>
<p>However, this pattern is not safe for use in multithreaded scenarios. The reason is because between the check for null and the calling of the handler, code executing on another thread may remove the handler. The check for null will pass, but when the call to the handler is made, it may then be null which causes a NullReferenceException. To illustrate how this can happen, consider the following code execution example.</p>
<table border="1" cellPadding="2" cellSpacing="0" style="width: 800px; text-align: left">
<tr>
<td>UI Thread</td>
<td>Worker Thread</td>
</tr>
<tr>
<td><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 protected\cf0  \cf3 virtual\cf0  \cf3 void\cf0  OnMyEvent(\cf4 EventArgs\cf0  e)\par ??        \{\par ??            \cf3 if\cf0  (MyEvent != \cf3 null\cf0 )\par ??            \{} --></p>
<p style="margin: 0px">        <span style="color: blue">protected</span> <span style="color: blue">virtual</span> <span style="color: blue">void</span> OnMyEvent(<span style="color: #2b91af">EventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">if</span> (MyEvent != <span style="color: blue">null</span>)</p>
<p style="margin: 0px">            {</p>
</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16 MyEvent -= \cf3 new\cf0  \cf4 EventHandler\cf0 (MyClass_MyEvent);} --></p>
<p style="margin: 0px">MyEvent -= <span style="color: blue">new</span> <span style="color: #2b91af">EventHandler</span>(MyClass_MyEvent);</p>
</td>
</tr>
<tr>
<td><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;}??\fs16                 MyEvent(\cf3 this\cf0 , e);\par ??            \}\par ??        \}} --></p>
<p style="margin: 0px">                MyEvent(<span style="color: blue">this</span>, e);</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">        }</p>
</td>
<td> </td>
</tr>
</table>
<p><big style="font-weight: bold"><big>Solution 1.A</big></big></p>
<p>One solution is to make a copy of the event delegate before performing the check for null:</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 protected\cf0  \cf3 virtual\cf0  \cf3 void\cf0  OnMyEvent(\cf4 EventArgs\cf0  e)\par ??        \{\par ??            \cf4 EventHandler\cf0  eventHandler = \cf3 this\cf0 .MyEvent;\par ??            \cf3 if\cf0  (eventHandler != \cf3 null\cf0 )\par ??            \{\par ??                eventHandler(\cf3 this\cf0 , e);\par ??            \}\par ??        \}} --></p>
<p style="margin: 0px">        <span style="color: blue">protected</span> <span style="color: blue">virtual</span> <span style="color: blue">void</span> OnMyEvent(<span style="color: #2b91af">EventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: #2b91af">EventHandler</span> eventHandler = <span style="color: blue">this</span>.MyEvent;</p>
<p style="margin: 0px">            <span style="color: blue">if</span> (eventHandler != <span style="color: blue">null</span>)</p>
<p style="margin: 0px">            {</p>
<p style="margin: 0px">                eventHandler(<span style="color: blue">this</span>, e);</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">        }</p>
<p>Since delegates are immutable, when the same UI/Worker code execution sequence occurs, the eventHandler copy will never be affected no matter how or when handlers are added or removed from MyEvent:</p>
<table border="1" cellPadding="2" cellSpacing="0" style="width: 800px; text-align: left">
<tr>
<td>UI Thread</td>
<td>Worker Thread</td>
</tr>
<tr>
<td><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 protected\cf0  \cf3 virtual\cf0  \cf3 void\cf0  OnMyEvent(\cf4 EventArgs\cf0  e)\par ??        \{\par ??            \cf4 EventHandler\cf0  eventHandler = \cf3 this\cf0 .MyEvent;\par ??            \cf3 if\cf0  (eventHandler != \cf3 null\cf0 )\par ??            \{} --></p>
<p style="margin: 0px">        <span style="color: blue">protected</span> <span style="color: blue">virtual</span> <span style="color: blue">void</span> OnMyEvent(<span style="color: #2b91af">EventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: #2b91af">EventHandler</span> eventHandler = <span style="color: blue">this</span>.MyEvent;</p>
<p style="margin: 0px">            <span style="color: blue">if</span> (eventHandler != <span style="color: blue">null</span>)</p>
<p style="margin: 0px">            {</p>
</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16 MyEvent -= \cf3 new\cf0  \cf4 EventHandler\cf0 (MyClass_MyEvent);} --></p>
<p style="margin: 0px">MyEvent -= <span style="color: blue">new</span> <span style="color: #2b91af">EventHandler</span>(MyClass_MyEvent);</p>
</td>
</tr>
<tr>
<td><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green128\blue0;\red0\green0\blue255;}??\fs16                 \cf3 //eventHandler will never change even \par ??\cf0                 \cf3 //if handlers are removed to added to MyEvent\par ??\cf0                 eventHandler(\cf4 this\cf0 , e);\par ??            \}\par ??        \}} --></p>
<p style="margin: 0px">                <span style="color: green">//eventHandler will never change even </span></p>
<p style="margin: 0px">                <span style="color: green">//if handlers are removed to added to MyEvent</span></p>
<p style="margin: 0px">                eventHandler(<span style="color: blue">this</span>, e);</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">        }</p>
</td>
<td> </td>
</tr>
</table>
<p><big style="font-weight: bold"><big>Solution 1.B</big></big></p>
<p>According to various blog posts, there is a potential problem with solution 1.A. According to <a href="http://code.logos.com/blog/2008/05/events_and_threads_part_3.html">this post</a>, <a href="http://www.amazon.com/Programming-NET-Components-Juval-Lowy/dp/0596102070">Juval Lowy</a> claims JIT compiler inlining may eliminate the copy and bring us back to the original problem. The solution is to raise the event in another method and use the attribute MethodImplOptions.NoInlining. Since passing the event to the method effectively makes a copy for us, we do not need to make another copy in the method.</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 protected\cf0  \cf3 virtual\cf0  \cf3 void\cf0  OnMyEvent(\cf4 EventArgs\cf0  e)\par ??        \{\par ??            RaiseEvent(\cf3 this\cf0 .MyEvent, e);\par ??        \}\par ??        \cf3 protected\cf0  \cf3 virtual\cf0  \cf3 void\cf0  OnMyGenericEvent(\cf4 MyEventArgs\cf0  e)\par ??        \{\par ??            RaiseEvent&amp;lt;\cf4 MyEventArgs\cf0 &amp;gt;(\cf3 this\cf0 .MyGenericEvent, e);\par ??        \}\par ??\par ??        [\cf4 MethodImpl\cf0 (\cf4 MethodImplOptions\cf0 .NoInlining)]\par ??        \cf3 private\cf0  \cf3 void\cf0  RaiseEvent(\cf4 EventHandler\cf0  eventHandler, \cf4 EventArgs\cf0  e)\par ??        \{\par ??            \cf3 if\cf0  (eventHandler != \cf3 null\cf0 )\par ??            \{\par ??                eventHandler(\cf3 this\cf0 , e);\par ??            \}\par ??        \}\par ??\par ??        [\cf4 MethodImpl\cf0 (\cf4 MethodImplOptions\cf0 .NoInlining)]\par ??        \cf3 private\cf0  \cf3 void\cf0  RaiseEvent&amp;lt;T&amp;gt;(\cf4 EventHandler\cf0 &amp;lt;T&amp;gt; eventHandler, T e)\par ??            \cf3 where\cf0  T : \cf4 EventArgs\par ??\cf0         \{\par ??            \cf3 if\cf0  (eventHandler != \cf3 null\cf0 )\par ??            \{\par ??                eventHandler(\cf3 this\cf0 , e);\par ??            \}\par ??        \}} --></p>
<p style="margin: 0px">        <span style="color: blue">protected</span> <span style="color: blue">virtual</span> <span style="color: blue">void</span> OnMyEvent(<span style="color: #2b91af">EventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            RaiseEvent(<span style="color: blue">this</span>.MyEvent, e);</p>
<p style="margin: 0px">        }</p>
<p style="margin: 0px">        <span style="color: blue">protected</span> <span style="color: blue">virtual</span> <span style="color: blue">void</span> OnMyGenericEvent(<span style="color: #2b91af">MyEventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            RaiseEvent&lt;<span style="color: #2b91af">MyEventArgs</span>&gt;(<span style="color: blue">this</span>.MyGenericEvent, e);</p>
<p style="margin: 0px">        }</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">        [<span style="color: #2b91af">MethodImpl</span>(<span style="color: #2b91af">MethodImplOptions</span>.NoInlining)]</p>
<p style="margin: 0px">        <span style="color: blue">private</span> <span style="color: blue">void</span> RaiseEvent(<span style="color: #2b91af">EventHandler</span> eventHandler, <span style="color: #2b91af">EventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">if</span> (eventHandler != <span style="color: blue">null</span>)</p>
<p style="margin: 0px">            {</p>
<p style="margin: 0px">                eventHandler(<span style="color: blue">this</span>, e);</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">        }</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">        [<span style="color: #2b91af">MethodImpl</span>(<span style="color: #2b91af">MethodImplOptions</span>.NoInlining)]</p>
<p style="margin: 0px">        <span style="color: blue">private</span> <span style="color: blue">void</span> RaiseEvent&lt;T&gt;(<span style="color: #2b91af">EventHandler</span>&lt;T&gt; eventHandler, T e)</p>
<p style="margin: 0px">            <span style="color: blue">where</span> T : <span style="color: #2b91af">EventArgs</span></p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">if</span> (eventHandler != <span style="color: blue">null</span>)</p>
<p style="margin: 0px">            {</p>
<p style="margin: 0px">                eventHandler(<span style="color: blue">this</span>, e);</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">        }</p>
<p>If we are using .NET 3.5 or higher we can create a single extension method to do all of this work for us:</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16     \cf3 public\cf0  \cf3 static\cf0  \cf3 class\cf0  \cf4 EventExtensions\par ??\cf0     \{\par ??        [\cf4 MethodImpl\cf0 (\cf4 MethodImplOptions\cf0 .NoInlining)]\par ??        \cf3 public\cf0  \cf3 static\cf0  \cf3 void\cf0  RaiseEvent(\cf3 this\cf0  \cf4 EventHandler\cf0  eventHandler, \cf3 object\cf0  sender, \cf4 EventArgs\cf0  e)\par ??        \{\par ??            \cf3 if\cf0  (eventHandler != \cf3 null\cf0 )\par ??            \{\par ??                eventHandler(sender, e);\par ??            \}\par ??        \}\par ??\par ??        [\cf4 MethodImpl\cf0 (\cf4 MethodImplOptions\cf0 .NoInlining)]\par ??        \cf3 public\cf0  \cf3 static\cf0  \cf3 void\cf0  RaiseEvent&amp;lt;T&amp;gt;(\cf3 this\cf0  \cf4 EventHandler\cf0 &amp;lt;T&amp;gt; eventHandler, \cf3 object\cf0  sender, T e)\par ??            \cf3 where\cf0  T : \cf4 EventArgs\par ??\cf0         \{\par ??            \cf3 if\cf0  (eventHandler != \cf3 null\cf0 )\par ??            \{\par ??                eventHandler(sender, e);\par ??            \}\par ??        \}\par ??    \}} --></p>
<p style="margin: 0px">    <span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: blue">class</span> <span style="color: #2b91af">EventExtensions</span></p>
<p style="margin: 0px">    {</p>
<p style="margin: 0px">        [<span style="color: #2b91af">MethodImpl</span>(<span style="color: #2b91af">MethodImplOptions</span>.NoInlining)]</p>
<p style="margin: 0px">        <span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: blue">void</span> RaiseEvent(<span style="color: blue">this</span> <span style="color: #2b91af">EventHandler</span> eventHandler, <span style="color: blue">object</span> sender, <span style="color: #2b91af">EventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">if</span> (eventHandler != <span style="color: blue">null</span>)</p>
<p style="margin: 0px">            {</p>
<p style="margin: 0px">                eventHandler(sender, e);</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">        }</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">        [<span style="color: #2b91af">MethodImpl</span>(<span style="color: #2b91af">MethodImplOptions</span>.NoInlining)]</p>
<p style="margin: 0px">        <span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: blue">void</span> RaiseEvent&lt;T&gt;(<span style="color: blue">this</span> <span style="color: #2b91af">EventHandler</span>&lt;T&gt; eventHandler, <span style="color: blue">object</span> sender, T e)</p>
<p style="margin: 0px">            <span style="color: blue">where</span> T : <span style="color: #2b91af">EventArgs</span></p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">if</span> (eventHandler != <span style="color: blue">null</span>)</p>
<p style="margin: 0px">            {</p>
<p style="margin: 0px">                eventHandler(sender, e);</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">        }</p>
<p style="margin: 0px">    }</p>
<p>Now raising events becomes very easy:</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 private\cf0  \cf3 event\cf0  \cf4 EventHandler\cf0  MyEvent;\par ??        \cf3 private\cf0  \cf3 event\cf0  \cf4 EventHandler\cf0 &amp;lt;\cf4 MyEventArgs\cf0 &amp;gt; MyGenericEvent;\par ??\par ??        \cf3 protected\cf0  \cf3 virtual\cf0  \cf3 void\cf0  OnMyEvent(\cf4 EventArgs\cf0  e)\par ??        \{\par ??            \cf3 this\cf0 .MyEvent.RaiseEvent(\cf3 this\cf0 , e);\par ??        \}\par ??        \cf3 protected\cf0  \cf3 virtual\cf0  \cf3 void\cf0  OnMyGenericEvent(\cf4 MyEventArgs\cf0  e)\par ??        \{\par ??            \cf3 this\cf0 .MyGenericEvent.RaiseEvent&amp;lt;\cf4 MyEventArgs\cf0 &amp;gt;(\cf3 this\cf0 , e);\par ??        \}} --></p>
<p style="margin: 0px">        <span style="color: blue">private</span> <span style="color: blue">event</span> <span style="color: #2b91af">EventHandler</span> MyEvent;</p>
<p style="margin: 0px">        <span style="color: blue">private</span> <span style="color: blue">event</span> <span style="color: #2b91af">EventHandler</span>&lt;<span style="color: #2b91af">MyEventArgs</span>&gt; MyGenericEvent;</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">        <span style="color: blue">protected</span> <span style="color: blue">virtual</span> <span style="color: blue">void</span> OnMyEvent(<span style="color: #2b91af">EventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">this</span>.MyEvent.RaiseEvent(<span style="color: blue">this</span>, e);</p>
<p style="margin: 0px">        }</p>
<p style="margin: 0px">        <span style="color: blue">protected</span> <span style="color: blue">virtual</span> <span style="color: blue">void</span> OnMyGenericEvent(<span style="color: #2b91af">MyEventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">this</span>.MyGenericEvent.RaiseEvent&lt;<span style="color: #2b91af">MyEventArgs</span>&gt;(<span style="color: blue">this</span>, e);</p>
<p style="margin: 0px">        }</p>
<p><big><big><span style="font-weight: bold">Problem #2: Raising an event causes handler to execute in a disposed object</span></big></big></p>
<p>Now we are getting into the subtle areas of multithreading. This is an important scenario to understand because even though it may seem unlikely, it is actually quite easy to get bitten by this bug. To keep things simple, we will use the 1.A solution for the demonstration. The problem can occur when a listener on the UI thread removes its handler and is disposed, all before the worker thread calls the handler copy. This problem is not limited to a worker/UI thread scenario, it exists for any scenario where multiple threads are adding or removing event handlers.</p>
<p><span style="color: red">SideNote: Event handlers are always executed on the thread that raised them, not the thread that added or removed the handler. For example, A UI control could start 10 worker threads where each worker adds an event handler. If the UI thread raises the event, all 10 handlers will execute on the UI thread.</span></p>
<p>To demonstrate problem #2, consider the following user control:</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;\red0\green128\blue0;}??\fs16     \cf3 public\cf0  \cf3 partial\cf0  \cf3 class\cf0  \cf4 MyUserControl\cf0  : \cf4 UserControl\par ??\cf0     \{\par ??        \cf3 public\cf0  \cf3 event\cf0  \cf4 EventHandler\cf0  MyEvent;\par ??\par ??        \cf3 public\cf0  MyUserControl()\par ??        \{\par ??            InitializeComponent();\par ??        \}\par ??\par ??        \cf3 public\cf0  \cf3 void\cf0  DemonstrateEventRaisedWhenDisposed()\par ??        \{\par ??            \cf3 this\cf0 .MyEvent += \cf3 new\cf0  \cf4 EventHandler\cf0 (MyUserControl_MyEvent);\par ??            \cf3 new\cf0  \cf4 Thread\cf0 (() =&amp;gt; OnMyEvent(\cf4 EventArgs\cf0 .Empty)).Start();\par ??            \cf3 this\cf0 .MyEvent -= \cf3 new\cf0  \cf4 EventHandler\cf0 (MyUserControl_MyEvent);\par ??            Dispose();\par ??        \}\par ??\par ??        \cf3 void\cf0  MyUserControl_MyEvent(\cf3 object\cf0  sender, \cf4 EventArgs\cf0  e)\par ??        \{\par ??            \cf5 //do something with the UI here\par ??\cf0         \}\par ??\par ??        \cf3 protected\cf0  \cf3 virtual\cf0  \cf3 void\cf0  OnMyEvent(\cf4 EventArgs\cf0  e)\par ??        \{\par ??            \cf4 EventHandler\cf0  eventHandler = \cf3 this\cf0 .MyEvent;\par ??            \cf3 if\cf0  (eventHandler != \cf3 null\cf0 )\par ??            \{\par ??                eventHandler(\cf3 this\cf0 , e);\par ??            \}\par ??        \}\par ??    \}\par ??} --></p>
<p style="margin: 0px">    <span style="color: blue">public</span> <span style="color: blue">partial</span> <span style="color: blue">class</span> <span style="color: #2b91af">MyUserControl</span> : <span style="color: #2b91af">UserControl</span></p>
<p style="margin: 0px">    {</p>
<p style="margin: 0px">        <span style="color: blue">public</span> <span style="color: blue">event</span> <span style="color: #2b91af">EventHandler</span> MyEvent;</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">        <span style="color: blue">public</span> MyUserControl()</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            InitializeComponent();</p>
<p style="margin: 0px">        }</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">        <span style="color: blue">public</span> <span style="color: blue">void</span> DemonstrateEventRaisedWhenDisposed()</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">this</span>.MyEvent += <span style="color: blue">new</span> <span style="color: #2b91af">EventHandler</span>(MyUserControl_MyEvent);</p>
<p style="margin: 0px">            <span style="color: blue">new</span> <span style="color: #2b91af">Thread</span>(() =&gt; OnMyEvent(<span style="color: #2b91af">EventArgs</span>.Empty)).Start();</p>
<p style="margin: 0px">            <span style="color: blue">this</span>.MyEvent -= <span style="color: blue">new</span> <span style="color: #2b91af">EventHandler</span>(MyUserControl_MyEvent);</p>
<p style="margin: 0px">            Dispose();</p>
<p style="margin: 0px">        }</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">        <span style="color: blue">void</span> MyUserControl_MyEvent(<span style="color: blue">object</span> sender, <span style="color: #2b91af">EventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: green">//do something with the UI here</span></p>
<p style="margin: 0px">        }</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">        <span style="color: blue">protected</span> <span style="color: blue">virtual</span> <span style="color: blue">void</span> OnMyEvent(<span style="color: #2b91af">EventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: #2b91af">EventHandler</span> eventHandler = <span style="color: blue">this</span>.MyEvent;</p>
<p style="margin: 0px">            <span style="color: blue">if</span> (eventHandler != <span style="color: blue">null</span>)</p>
<p style="margin: 0px">            {</p>
<p style="margin: 0px">                eventHandler(<span style="color: blue">this</span>, e);</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">        }</p>
<p style="margin: 0px">    }</p>
<p>If you are not familiar with lambda expressions, basically what is happening is that when DemonstrateEventRaisedWhenDisposed is called:</p>
<ol>
<li>An event handler is added to MyEvent</li>
<li>A thread is started that will call OnMyEvent which raises MyEvent</li>
<li>The previously added event handler from MyEvent is removed</li>
<li>The control is disposed</li>
</ol>
<p>Since there is no guarantee when the thread will start and execute, the code could execute in a safe way such as:</p>
<table border="1" cellPadding="2" cellSpacing="0" style="width: 900px; text-align: left">
<tr>
<td>UI Thread</td>
<td>Worker Thread</td>
</tr>
<tr>
<td><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 public\cf0  \cf3 void\cf0  DemonstrateEventRaisedWhenDisposed()\par ??        \{\par ??            \cf3 this\cf0 .MyEvent += \cf3 new\cf0  \cf4 EventHandler\cf0 (MyUserControl_MyEvent);\par ??            \cf3 this\cf0 .MyEvent -= \cf3 new\cf0  \cf4 EventHandler\cf0 (MyUserControl_MyEvent);} --></p>
<p style="margin: 0px">        <span style="color: blue">public</span> <span style="color: blue">void</span> DemonstrateEventRaisedWhenDisposed()</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">this</span>.MyEvent += <span style="color: blue">new</span> <span style="color: #2b91af">EventHandler</span>(MyUserControl_MyEvent);</p>
<p style="margin: 0px">            <span style="color: blue">this</span>.MyEvent -= <span style="color: blue">new</span> <span style="color: #2b91af">EventHandler</span>(MyUserControl_MyEvent);</p>
</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 protected\cf0  \cf3 virtual\cf0  \cf3 void\cf0  OnMyEvent(\cf4 EventArgs\cf0  e)\par ??        \{\par ??            \cf4 EventHandler\cf0  eventHandler = \cf3 this\cf0 .MyEvent;\par ??            \cf3 if\cf0  (eventHandler != \cf3 null\cf0 )\par ??            \{\par ??                eventHandler(\cf3 this\cf0 , e);\par ??            \}\par ??        \}} --></p>
<p style="margin: 0px">        <span style="color: blue">protected</span> <span style="color: blue">virtual</span> <span style="color: blue">void</span> OnMyEvent(<span style="color: #2b91af">EventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: #2b91af">EventHandler</span> eventHandler = <span style="color: blue">this</span>.MyEvent;</p>
<p style="margin: 0px">            <span style="color: blue">if</span> (eventHandler != <span style="color: blue">null</span>)</p>
<p style="margin: 0px">            {</p>
<p style="margin: 0px">                eventHandler(<span style="color: blue">this</span>, e);</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">        }</p>
</td>
</tr>
<tr>
<td><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;}??\fs16             Dispose();\par ??        \}\par ??} --></p>
<p style="margin: 0px">            Dispose();</p>
<p style="margin: 0px">        }</p>
</td>
<td> </td>
</tr>
</table>
<p>In this scenario, the event will not be raised by the worker thread, therefore the control will safely dispose and nothing bad will happen. But all it takes is some bad timing and a few context switches by the OS to expose the problem:</p>
<table border="1" cellPadding="2" cellSpacing="0" style="width: 1000px; text-align: left">
<tr>
<td>UI Thread</td>
<td>Worker Thread</td>
</tr>
<tr>
<td><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 public\cf0  \cf3 void\cf0  DemonstrateEventRaisedWhenDisposed()\par ??        \{\par ??            \cf3 this\cf0 .MyEvent += \cf3 new\cf0  \cf4 EventHandler\cf0 (MyUserControl_MyEvent);} --></p>
<p style="margin: 0px">        <span style="color: blue">public</span> <span style="color: blue">void</span> DemonstrateEventRaisedWhenDisposed()</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">this</span>.MyEvent += <span style="color: blue">new</span> <span style="color: #2b91af">EventHandler</span>(MyUserControl_MyEvent);</p>
</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 protected\cf0  \cf3 virtual\cf0  \cf3 void\cf0  OnMyEvent(\cf4 EventArgs\cf0  e)\par ??        \{\par ??            \cf4 EventHandler\cf0  eventHandler = \cf3 this\cf0 .MyEvent;\par ??            \cf3 if\cf0  (eventHandler != \cf3 null\cf0 )\par ??            \{} --></p>
<p style="margin: 0px">        <span style="color: blue">protected</span> <span style="color: blue">virtual</span> <span style="color: blue">void</span> OnMyEvent(<span style="color: #2b91af">EventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: #2b91af">EventHandler</span> eventHandler = <span style="color: blue">this</span>.MyEvent;</p>
<p style="margin: 0px">            <span style="color: blue">if</span> (eventHandler != <span style="color: blue">null</span>)</p>
<p style="margin: 0px">            {</p>
</td>
</tr>
<tr>
<td><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16             \cf3 this\cf0 .MyEvent -= \cf3 new\cf0  \cf4 EventHandler\cf0 (MyUserControl_MyEvent);\par ??            Dispose();\par ??        \}} --></p>
<p style="margin: 0px">            <span style="color: blue">this</span>.MyEvent -= <span style="color: blue">new</span> <span style="color: #2b91af">EventHandler</span>(MyUserControl_MyEvent);</p>
<p style="margin: 0px">            Dispose();</p>
<p style="margin: 0px">        }</p>
</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;}??\fs16                 eventHandler(\cf3 this\cf0 , e);} --></p>
<p style="margin: 0px">                eventHandler(<span style="color: blue">this</span>, e);</p>
<p style="font-size: 8pt; background: white 0% 50%; color: black; font-family: Courier New; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial"><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;\red0\green128\blue0;}??\fs16                 \cf3 void\cf0  MyUserControl_MyEvent(\cf3 object\cf0  sender, \cf4 EventArgs\cf0  e)\par ??                \{\par ??                    \cf5 //two bad things: control is disposed, and we are\par ??\cf0                     \cf5 //executing on a worker thread in the control's code\par ??\cf0                 \}} --></p>
<p style="margin: 0px">                <span style="color: blue">void</span> MyUserControl_MyEvent(<span style="color: blue">object</span> sender, <span style="color: #2b91af">EventArgs</span> e)</p>
<p style="margin: 0px">                {</p>
<p style="margin: 0px">                    <span style="color: green">//two bad things: control is disposed, and we are</span></p>
<p style="margin: 0px">                    <span style="color: green">//executing on a worker thread in the control&#8217;s code</span></p>
<p style="margin: 0px">                }</p>
</td>
</tr>
</table>
<p>All it took was the worker to pass the null check with the delegate copy, the UI thread removing the original handler then disposing, and then the worker calling the handler that was never removed from the copy. The MyUserControl_MyEvent method will effectively be executing in the UI control code (yet still on the worker thread; a post to the UI thread is needed to update the UI) even though the control has been disposed.</p>
<p><big style="font-weight: bold"><big>Solution 2.A</big></big></p>
<p>Unfortunately if we do not put any restrictions on which thread handles the events, there is little we can do to solve the problem. But if we constrain our requirements such that events must only be handled on the UI thread, we are able to come up with a relatively simple solution. The solution is to always call the OnXXX method on the UI thread. If a worker needs to raise the event, the worker should post the OnXXX method to the UI thread. This will guarantee that the handlers will never be called when null. This requirement also allows us to remove the need for the copy since we specified that worker threads will not be listening for the event. Using an extension method and the UI&#8217;s SynchronizationContext (for posting to the UI thread) gives the simple solution:</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 public\cf0  \cf3 static\cf0  \cf3 void\cf0  PostExt&amp;lt;T&amp;gt;(\cf3 this\cf0  \cf4 SynchronizationContext\cf0  synchronizationContext, T eventArgs, \cf4 SendOrPostCallback\cf0  func)\par ??        \{\par ??            synchronizationContext.Post(func, eventArgs);\par ??        \}} --></p>
<p style="margin: 0px">        <span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: blue">void</span> PostExt&lt;T&gt;(<span style="color: blue">this</span> <span style="color: #2b91af">SynchronizationContext</span> synchronizationContext, T eventArgs, <span style="color: #2b91af">SendOrPostCallback</span> func)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            synchronizationContext.Post(func, eventArgs);</p>
<p style="margin: 0px">        }</p>
<p>A call from a worker thread would use the UI&#8217;s synchronization context to post the OnXXXmethod to the UI thread for safely raising the event:</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16             \cf3 new\cf0  \cf4 Thread\cf0 (() =&amp;gt;\par ??                synchronizationContext.PostExt(\cf4 EventArgs\cf0 .Empty, e =&amp;gt; OnMyEvent(\cf4 EventArgs\cf0 .Empty))\par ??                ).Start();} --></p>
<p style="margin: 0px">synchronizationContext.PostExt(<span style="color: #2b91af">EventArgs</span>.Empty, e =&gt; OnMyEvent(<span style="color: #2b91af">EventArgs</span>.Empty))</p>
<p>The synchronizationContext variable is the SynchronizationContext that was captured on the UI thread before the worker was started. For more information read the original <a href="http://blog.quantumbitdesigns.com/2008/06/10/stop-polluting-the-ui-thread-use-a-threadbarrier/">ThreadBarrier</a> article and stay tuned for tomorrow&#8217;s complete coverage and solution using this technique.</p>
<p><big style="font-weight: bold"><big>Solution 2.B</big></big></p>
<p>If our requirements are unconstrained and any object on any thread could be listening for events, we are in trouble. The only way to prevent the race condition is to lock around the event&#8217;s null check and handler call. However this is bad practice since it can lead to deadlocks (subject for another blog entry).</p>
<p><span style="color: red">Do not use this code:</span></p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 private\cf0  \cf3 event\cf0  \cf4 EventHandler\cf0  MyEvent;\par ??        \cf3 private\cf0  \cf3 object\cf0  myEventObject = \cf3 new\cf0  \cf3 object\cf0 ();\par ??\par ??        \cf3 protected\cf0  \cf3 virtual\cf0  \cf3 void\cf0  OnMyEvent(\cf4 EventArgs\cf0  e)\par ??        \{\par ??            \cf3 lock\cf0  (myEventObject)\par ??            \{\par ??                \cf3 this\cf0 .MyEvent.RaiseEvent(\cf3 this\cf0 , e);\par ??            \}\par ??        \}} --></p>
<p style="margin: 0px">        <span style="color: blue">private</span> <span style="color: blue">event</span> <span style="color: #2b91af">EventHandler</span> MyEvent;</p>
<p style="margin: 0px">        <span style="color: blue">private</span> <span style="color: blue">object</span> myEventObject = <span style="color: blue">new</span> <span style="color: blue">object</span>();</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">        <span style="color: blue">protected</span> <span style="color: blue">virtual</span> <span style="color: blue">void</span> OnMyEvent(<span style="color: #2b91af">EventArgs</span> e)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">lock</span> (myEventObject)</p>
<p style="margin: 0px">            {</p>
<p style="margin: 0px">                <span style="color: blue">this</span>.MyEvent.RaiseEvent(<span style="color: blue">this</span>, e);</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">        }</p>
<p><big style="font-weight: bold"><big>Problem #3: Adding and removing of event handlers is not thread-safe by default</big></big></p>
<p>When a standard event is declared in a class and no Add/Remove accessors are explicitly defined, the C# 2.0+ compiler automatically make accesses to the event thread-safe. Consider the following standard event:</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 private\cf0  \cf3 event\cf0  \cf4 EventHandler\cf0  MyEvent;} --></p>
<p style="margin: 0px">        <span style="color: blue">private</span> <span style="color: blue">event</span> <span style="color: #2b91af">EventHandler</span> MyEvent;</p>
<p>The compiler will automatically create thread-safe accessors:</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red43\green145\blue175;\red0\green0\blue255;}??\fs16         [\cf3 MethodImpl\cf0 (\cf3 MethodImplOptions\cf0 .Synchronized)]\par ??        \cf4 private\cf0  \cf4 void\cf0  add_MyEvent(\cf3 EventHandler\cf0  value)\par ??        \{\par ??            \cf4 this\cf0 .MyEvent = (\cf3 EventHandler\cf0 )\cf3 Delegate\cf0 .Combine(\cf4 this\cf0 .MyEvent, value);\par ??        \}\par ??        [\cf3 MethodImpl\cf0 (\cf3 MethodImplOptions\cf0 .Synchronized)]\par ??        \cf4 private\cf0  \cf4 void\cf0  remove_MyEvent(\cf3 EventHandler\cf0  value)\par ??        \{\par ??            \cf4 this\cf0 .MyEvent = (\cf3 EventHandler\cf0 )\cf3 Delegate\cf0 .Remove(\cf4 this\cf0 .MyEvent, value);\par ??        \}} --></p>
<p style="margin: 0px">        [<span style="color: #2b91af">MethodImpl</span>(<span style="color: #2b91af">MethodImplOptions</span>.Synchronized)]</p>
<p style="margin: 0px">        <span style="color: blue">private</span> <span style="color: blue">void</span> add_MyEvent(<span style="color: #2b91af">EventHandler</span> value)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">this</span>.MyEvent = (<span style="color: #2b91af">EventHandler</span>)<span style="color: #2b91af">Delegate</span>.Combine(<span style="color: blue">this</span>.MyEvent, value);</p>
<p style="margin: 0px">        }</p>
<p style="margin: 0px">        [<span style="color: #2b91af">MethodImpl</span>(<span style="color: #2b91af">MethodImplOptions</span>.Synchronized)]</p>
<p style="margin: 0px">        <span style="color: blue">private</span> <span style="color: blue">void</span> remove_MyEvent(<span style="color: #2b91af">EventHandler</span> value)</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">this</span>.MyEvent = (<span style="color: #2b91af">EventHandler</span>)<span style="color: #2b91af">Delegate</span>.Remove(<span style="color: blue">this</span>.MyEvent, value);</p>
<p style="margin: 0px">        }</p>
<p>Unfortunately there is still a problem. When subscribing to the event in the following way:<br />
<!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16             MyEvent += \cf3 new\cf0  \cf4 EventHandler\cf0 (MyClass_MyEvent);} --></p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">            MyEvent += <span style="color: blue">new</span> <span style="color: #2b91af">EventHandler</span>(MyClass_MyEvent);</p>
<p>The compiler will convert this to:</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red43\green145\blue175;\red0\green0\blue255;}??\fs16             MyEvent = (\cf3 EventHandler\cf0 )\cf3 Delegate\cf0 .Combine(MyEvent, \cf4 new\cf0  \cf3 EventHandler\cf0 (MyClass_MyEvent));} --></p>
<p style="margin: 0px">            MyEvent = (<span style="color: #2b91af">EventHandler</span>)<span style="color: #2b91af">Delegate</span>.Combine(MyEvent, <span style="color: blue">new</span> <span style="color: #2b91af">EventHandler</span>(MyClass_MyEvent));</p>
<p>This makes the operation not thread-safe. It is almost as if the compiler only went half way to thread safety. If we were to start two threads running in parallel both adding and removing a handler (only one is shown below):</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16             \cf3 int\cf0  numLoops = 10000000;\par ??            \cf4 Thread\cf0  thread1 = \cf3 new\cf0  \cf4 Thread\cf0 (() =&amp;gt; \{\par ??                \cf3 for\cf0  (\cf3 int\cf0  i = 0; i &amp;lt; numLoops; ++i)\par ??                \{\par ??                    \cf3 this\cf0 .MySafeEvent += \cf3 new\cf0  \cf4 EventHandler\cf0 (EventHandlerMethod);\par ??                    \cf3 this\cf0 .MySafeEvent -= \cf3 new\cf0  \cf4 EventHandler\cf0 (EventHandlerMethod);\par ??                \}\par ??            \});\par ??            thread1.IsBackground = \cf3 true\cf0 ;\par ??            thread1.Start();} --></p>
<p style="margin: 0px">            <span style="color: blue">int</span> numLoops = 10000000;</p>
<p style="margin: 0px">            <span style="color: #2b91af">Thread</span> thread1 = <span style="color: blue">new</span> <span style="color: #2b91af">Thread</span>(() =&gt; {</p>
<p style="margin: 0px">                <span style="color: blue">for</span> (<span style="color: blue">int</span> i = 0; i &lt; numLoops; ++i)</p>
<p style="margin: 0px">                {</p>
<p style="margin: 0px">                    <span style="color: blue">this</span>.MySafeEvent += <span style="color: blue">new</span> <span style="color: #2b91af">EventHandler</span>(EventHandlerMethod);</p>
<p style="margin: 0px">                    <span style="color: blue">this</span>.MySafeEvent -= <span style="color: blue">new</span> <span style="color: #2b91af">EventHandler</span>(EventHandlerMethod);</p>
<p style="margin: 0px">                }</p>
<p style="margin: 0px">            });</p>
<p style="margin: 0px">            thread1.IsBackground = <span style="color: blue">true</span>;</p>
<p style="margin: 0px">            thread1.Start();</p>
<p>If the adding and removing of the event were thread-safe, once both threads were complete the event should have zero handlers. Since the operation is not thread-safe, what happens is the event will have a few extra handlers due to races.</p>
<p><big style="font-weight: bold"><big>Solution 3</big></big><big style="font-weight: bold"><big>.A</big></big></p>
<p>If multiple threads need to add and remove handlers, the event should be designed using the following pattern:</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 private\cf0  \cf3 object\cf0  mySafeEventLock = \cf3 new\cf0  \cf3 object\cf0 ();\par ??        \cf3 private\cf0  \cf4 EventHandler\cf0  mySafeEventHandler;\par ??\par ??        \cf3 public\cf0  \cf3 event\cf0  \cf4 EventHandler\cf0  MySafeEvent\par ??        \{\par ??            \cf3 add\par ??\cf0             \{\par ??                \cf3 lock\cf0  (\cf3 this\cf0 .mySafeEventLock)\par ??                \{\par ??                    \cf3 this\cf0 .mySafeEventHandler += \cf3 value\cf0 ;\par ??                \}\par ??            \}\par ??            \cf3 remove\par ??\cf0             \{\par ??                \cf3 lock\cf0  (\cf3 this\cf0 .mySafeEventLock)\par ??                \{\par ??                    \cf3 this\cf0 .mySafeEventHandler -= \cf3 value\cf0 ;\par ??                \}\par ??            \}\par ??        \}} --></p>
<p style="margin: 0px">        <span style="color: blue">private</span> <span style="color: blue">object</span> mySafeEventLock = <span style="color: blue">new</span> <span style="color: blue">object</span>();</p>
<p style="margin: 0px">        <span style="color: blue">private</span> <span style="color: #2b91af">EventHandler</span> mySafeEventHandler;</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">        <span style="color: blue">public</span> <span style="color: blue">event</span> <span style="color: #2b91af">EventHandler</span> MySafeEvent</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">add</span></p>
<p style="margin: 0px">            {</p>
<p style="margin: 0px">                <span style="color: blue">lock</span> (<span style="color: blue">this</span>.mySafeEventLock)</p>
<p style="margin: 0px">                {</p>
<p style="margin: 0px">                    <span style="color: blue">this</span>.mySafeEventHandler += <span style="color: blue">value</span>;</p>
<p style="margin: 0px">                }</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">            <span style="color: blue">remove</span></p>
<p style="margin: 0px">            {</p>
<p style="margin: 0px">                <span style="color: blue">lock</span> (<span style="color: blue">this</span>.mySafeEventLock)</p>
<p style="margin: 0px">                {</p>
<p style="margin: 0px">                    <span style="color: blue">this</span>.mySafeEventHandler -= <span style="color: blue">value</span>;</p>
<p style="margin: 0px">                }</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">        }</p>
<p>The C# compiler will now make adding and removing handlers normal. This is code after compilation (identical to before compilation):</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16             MySafeEvent += \cf3 new\cf0  \cf4 EventHandler\cf0 (\cf3 this\cf0 .EventHandlerMethod);} --></p>
<p style="margin: 0px">            MySafeEvent += <span style="color: blue">new</span> <span style="color: #2b91af">EventHandler</span>(<span style="color: blue">this</span>.EventHandlerMethod);</p>
<p>However, the addition and removal of the event is converted (again this is post compilation):</p>
<p><!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs16         \cf3 public\cf0  \cf3 event\cf0  \cf4 EventHandler\cf0  MySafeEvent\par ??        \{\par ??            \cf3 add\par ??\cf0             \{\par ??                \cf3 lock\cf0  (\cf3 this\cf0 .mySafeEventLock)\par ??                \{\par ??                    \cf3 this\cf0 .mySafeEventHandler = (\cf4 EventHandler\cf0 )\cf4 Delegate\cf0 .Combine(\cf3 this\cf0 .mySafeEventHandler, \cf3 value\cf0 );\par ??                \}\par ??            \}\par ??            \cf3 remove\par ??\cf0             \{\par ??                \cf3 lock\cf0  (\cf3 this\cf0 .mySafeEventLock)\par ??                \{\par ??                    \cf3 this\cf0 .mySafeEventHandler = (\cf4 EventHandler\cf0 )\cf4 Delegate\cf0 .Remove(\cf3 this\cf0 .mySafeEventHandler, \cf3 value\cf0 );\par ??                \}\par ??            \}\par ??        \}} --></p>
<p style="margin: 0px">        <span style="color: blue">public</span> <span style="color: blue">event</span> <span style="color: #2b91af">EventHandler</span> MySafeEvent</p>
<p style="margin: 0px">        {</p>
<p style="margin: 0px">            <span style="color: blue">add</span></p>
<p style="margin: 0px">            {</p>
<p style="margin: 0px">                <span style="color: blue">lock</span> (<span style="color: blue">this</span>.mySafeEventLock)</p>
<p style="margin: 0px">                {</p>
<p style="margin: 0px">                    <span style="color: blue">this</span>.mySafeEventHandler = (<span style="color: #2b91af">EventHandler</span>)<span style="color: #2b91af">Delegate</span>.Combine(<span style="color: blue">this</span>.mySafeEventHandler, <span style="color: blue">value</span>);</p>
<p style="margin: 0px">                }</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">            <span style="color: blue">remove</span></p>
<p style="margin: 0px">            {</p>
<p style="margin: 0px">                <span style="color: blue">lock</span> (<span style="color: blue">this</span>.mySafeEventLock)</p>
<p style="margin: 0px">                {</p>
<p style="margin: 0px">                    <span style="color: blue">this</span>.mySafeEventHandler = (<span style="color: #2b91af">EventHandler</span>)<span style="color: #2b91af">Delegate</span>.Remove(<span style="color: blue">this</span>.mySafeEventHandler, <span style="color: blue">value</span>);</p>
<p style="margin: 0px">                }</p>
<p style="margin: 0px">            }</p>
<p style="margin: 0px">        }</p>
<p>But since the handler update is happening inside the lock, the adds and removes are thread-safe. Click <a href="http://www.quantumbitdesigns.com/blogposts/0018/files/EventsAndThreadSafety.zip">here for a sample</a> that demonstrates both safe and unsafe event designs.</p>
<p><big style="font-weight: bold"><big>Conclusion</big></big></p>
<p>There are many mind bending scenarios involved when events are mixed with multithreading. It is best to try and keep things as simple as possible. Hopefully this post serves as a great reference for things to think about when designing your events, classes, and threads.</p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblog.quantumbitdesigns.com%2f2008%2f06%2f17%2fevents-and-threads%2f"><img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.quantumbitdesigns.com%2f2008%2f06%2f17%2fevents-and-threads%2f" alt="kick it on DotNetKicks.com" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.quantumbitdesigns.com/2008/07/22/events-and-threads/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
