<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>NicolBlog : Threading</title><link>http://blogs.msdn.com/nicold/archive/tags/Threading/default.aspx</link><description>Tags: Threading</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Update WinForm interface from a different thread</title><link>http://blogs.msdn.com/nicold/archive/2007/12/29/update-winform-interface-from-a-different-thread.aspx</link><pubDate>Sat, 29 Dec 2007 20:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6899052</guid><dc:creator>NicolD</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/nicold/comments/6899052.aspx</comments><wfw:commentRss>http://blogs.msdn.com/nicold/commentrss.aspx?PostID=6899052</wfw:commentRss><description>&lt;p&gt;Well, this is a typical issue when you have a thread that works (i.e. a Workflow) and a UI that needs to be updated.&lt;/p&gt; &lt;p&gt;Let assume that you have a WinFom and you need to update its windows Title from another thread. The other thread needs to call "UpdateTitle" public method of current Form instance. If you write the following code:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainForm : Form
{
   ...
   
   &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateTitle(&lt;span class="kwrd"&gt;string&lt;/span&gt; newTitle)
   {
      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Text = newTitle;         
   }

   ...
}&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;
&lt;p&gt;&lt;span class="kwrd"&gt;UpdateTitle will work only if you call the method from the UI thread.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In order to make this call thread safe, I found two ways, choose the one that fits your needs:-)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Method ONE: Using a delegate&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainForm : Form
{
   ...
   
   &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateTitleDelegate(&lt;span class="kwrd"&gt;string&lt;/span&gt; s);
   &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateTitle(&lt;span class="kwrd"&gt;string&lt;/span&gt; newTitle)
   {
   &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.InvokeRequired)             
      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Invoke(&lt;span class="kwrd"&gt;new&lt;/span&gt; UpdateTitleDelegate                 
         (&lt;span class="kwrd"&gt;this&lt;/span&gt;.UpdateTitle), newTitle);         
   &lt;span class="kwrd"&gt;else&lt;/span&gt;         
      {             
      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Text = newTitle;         
      }
   }

   ...
}&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;h1&gt;Method TWO: using MethodInvoker&lt;/h1&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainForm : Form
{
   ...
      
   &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateTitle(&lt;span class="kwrd"&gt;string&lt;/span&gt; newTitle)
   {
   &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.InvokeRequired)             
      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Invoke(&lt;span class="kwrd"&gt;new&lt;/span&gt; MethodInvoker(&lt;span class="kwrd"&gt;delegate&lt;/span&gt;()
      {
      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Text = newTitle;    
      }));
   &lt;span class="kwrd"&gt;else&lt;/span&gt;         
      {             
      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Text = newTitle;         
      }
   }
   ...
}
&lt;/pre&gt;
&lt;p&gt;For more information have a look to &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx" target="_blank"&gt;Control.InvokeRequired&lt;/a&gt; property on MSDN.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6899052" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/nicold/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://blogs.msdn.com/nicold/archive/tags/Threading/default.aspx">Threading</category><category domain="http://blogs.msdn.com/nicold/archive/tags/Windows+Form/default.aspx">Windows Form</category></item><item><title>Avoid threads deadlock</title><link>http://blogs.msdn.com/nicold/archive/2007/10/03/avoid-threads-deadlock.aspx</link><pubDate>Wed, 03 Oct 2007 16:28:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5262868</guid><dc:creator>NicolD</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/nicold/comments/5262868.aspx</comments><wfw:commentRss>http://blogs.msdn.com/nicold/commentrss.aspx?PostID=5262868</wfw:commentRss><description>&lt;P&gt;On this month's issue of MSDN Magazine, &lt;A class="" href="http://blogs.msdn.com/toub/" target=_blank mce_href="http://blogs.msdn.com/toub/"&gt;Stephen Toub&lt;/A&gt; describe the class&amp;nbsp;DdMonitor. DdMonitor implements almost all interfaces exposed by .NET System.Threading.Monitor class but&amp;nbsp;includes deadlock detection capabilities too. &lt;/P&gt;
&lt;P&gt;With the objective to make available a&amp;nbsp;lock(...) keyword replacement, a static DdMonitor.Lock(...) is implemented too.&lt;/P&gt;
&lt;P&gt;&lt;A class="" href="http://msdn.microsoft.com/msdnmag/issues/07/10/netmatters/default.aspx" target=_blank mce_href="http://msdn.microsoft.com/msdnmag/issues/07/10/netmatters/default.aspx"&gt;A System.Threading.Monitor replacement to avoid threads deadlocks&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5262868" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/nicold/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://blogs.msdn.com/nicold/archive/tags/Deadlock/default.aspx">Deadlock</category><category domain="http://blogs.msdn.com/nicold/archive/tags/Threading/default.aspx">Threading</category></item></channel></rss>