<?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>Being Cellfish : Christmas</title><link>http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx</link><description>Tags: Christmas</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>The 2009 Advent Calendar Wrap Up</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/25/the-2009-advent-calendar-wrap-up.aspx</link><pubDate>Fri, 25 Dec 2009 08:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930606</guid><dc:creator>cellfish</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930606.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930606</wfw:commentRss><description>&lt;P&gt;So I hope I showed you a way to BDD/TDD a thread safe solution without slow pesky tests that needs a number of helper threads to verify thread safety. Also, you're not guaranteed that your code is thread safe just because of your tests when you use threads to try and break your code. You can use something like &lt;A href="http://research.microsoft.com/en-us/projects/chess/" target=_blank mce_href="http://research.microsoft.com/en-us/projects/chess/"&gt;Chess&lt;/A&gt; to find such bugs but having tests that consistently verifies thread safety is much better IMHO.&lt;/P&gt;
&lt;P&gt;And did we create better code this way (because BDD/TDD is about writing better code, right)? I think the separation of concerns between the ImportantObject, ImportantProvider and the Transaction are pretty neat. The introduction of MutexWrapper might be questionable for some people but it illustrates how different concerns should be separated and by doing so you can test more things in a simple way.&lt;/P&gt;
&lt;P&gt;For your convenience &lt;A href="http://blogs.msdn.com/cellfish/pages/christmas-2009.aspx" mce_href="http://blogs.msdn.com/cellfish/pages/christmas-2009.aspx"&gt;here is a summary&lt;/A&gt; of all links and the &lt;A href="http://blogs.msdn.com/cellfish/pages/final-code-version-for-2009-advent-calendar.aspx" mce_href="http://blogs.msdn.com/cellfish/pages/final-code-version-for-2009-advent-calendar.aspx"&gt;final version of the code&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930606" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item><item><title>2009 Advent Calendar December 24th</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/24/2009-advent-calendar-december-24th.aspx</link><pubDate>Thu, 24 Dec 2009 08:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930596</guid><dc:creator>cellfish</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930596.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930596</wfw:commentRss><description>&lt;P&gt;As I mentioned yesterday we now don't have any tests for the MutexWrapper which is a thin wrapper for the Mutex implementation in .Net. I don't think it is necessary to always have tests for these thin wrappers but sometimes it is a good idea to add a few tests just to verify that you've understood how the API works. These tests should not be run all the time as all your other unit tests but should be part of your acceptance test suite or something similar. Keep them and run them from time to time. This is how it might look for the MutexWrapper:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; MutexWrapper
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;readonly&lt;/SPAN&gt; Mutex _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Mutex();
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public virtual&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; WaitOne()
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;            _lock.WaitOne();
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public virtual&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; ReleaseMutex()
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;            _lock.ReleaseMutex();
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;    }
&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Given_an_unlocked_MutexWrapper
&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; MutexWrapper _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MutexWrapper();
&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;        [Fact(Timeout = 1000)]
&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_be_possible_to_WaitOne()
&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;            _lock.WaitOne();
&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;    }
&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Given_a_locked_MutexWrapper : IDisposable
&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;  29:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; MutexWrapper _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MutexWrapper();
&lt;SPAN class=lnum&gt;  30:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Thread _thread;
&lt;SPAN class=lnum&gt;  31:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; _gotLock = &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;;
&lt;SPAN class=lnum&gt;  32:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  33:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Given_a_locked_MutexWrapper()
&lt;SPAN class=lnum&gt;  34:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  35:  &lt;/SPAN&gt;            _thread = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Thread(() =&amp;gt;
&lt;SPAN class=lnum&gt;  36:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  37:  &lt;/SPAN&gt;                _lock.WaitOne();
&lt;SPAN class=lnum&gt;  38:  &lt;/SPAN&gt;                _gotLock = &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;;
&lt;SPAN class=lnum&gt;  39:  &lt;/SPAN&gt;                _lock.ReleaseMutex();
&lt;SPAN class=lnum&gt;  40:  &lt;/SPAN&gt;            });
&lt;SPAN class=lnum&gt;  41:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  42:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  43:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Dispose()
&lt;SPAN class=lnum&gt;  44:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  45:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (_thread != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
&lt;SPAN class=lnum&gt;  46:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  47:  &lt;/SPAN&gt;                _thread.Abort();
&lt;SPAN class=lnum&gt;  48:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  49:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  50:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  51:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; CompleteSetup()
&lt;SPAN class=lnum&gt;  52:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  53:  &lt;/SPAN&gt;            _lock.WaitOne();
&lt;SPAN class=lnum&gt;  54:  &lt;/SPAN&gt;            _thread.Start();
&lt;SPAN class=lnum&gt;  55:  &lt;/SPAN&gt;            Assert.False(_thread.Join(250));
&lt;SPAN class=lnum&gt;  56:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  57:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  58:  &lt;/SPAN&gt;        [Fact(Timeout = 1000)]
&lt;SPAN class=lnum&gt;  59:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_block_on_WaitOne()
&lt;SPAN class=lnum&gt;  60:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  61:  &lt;/SPAN&gt;            CompleteSetup();
&lt;SPAN class=lnum&gt;  62:  &lt;/SPAN&gt;            Assert.False(_gotLock);
&lt;SPAN class=lnum&gt;  63:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  64:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  65:  &lt;/SPAN&gt;        [Fact(Timeout = 1000)]
&lt;SPAN class=lnum&gt;  66:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_complete_WaitOne_once_released()
&lt;SPAN class=lnum&gt;  67:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  68:  &lt;/SPAN&gt;            CompleteSetup();
&lt;SPAN class=lnum&gt;  69:  &lt;/SPAN&gt;            _lock.ReleaseMutex();
&lt;SPAN class=lnum&gt;  70:  &lt;/SPAN&gt;            Assert.True(_thread.Join(500));
&lt;SPAN class=lnum&gt;  71:  &lt;/SPAN&gt;            Assert.True(_gotLock);
&lt;SPAN class=lnum&gt;  72:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  73:  &lt;/SPAN&gt;    }
&lt;SPAN class=lnum&gt;  74:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  75:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Given_an_abandoned_MutexWrapper : IDisposable
&lt;SPAN class=lnum&gt;  76:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;  77:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; MutexWrapper _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MutexWrapper();
&lt;SPAN class=lnum&gt;  78:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; EventWaitHandle _threadStarted = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; EventWaitHandle(&lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;, EventResetMode.ManualReset);
&lt;SPAN class=lnum&gt;  79:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; EventWaitHandle _threadStop = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; EventWaitHandle(&lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;, EventResetMode.ManualReset);
&lt;SPAN class=lnum&gt;  80:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Thread _thread;
&lt;SPAN class=lnum&gt;  81:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  82:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Given_an_abandoned_MutexWrapper()
&lt;SPAN class=lnum&gt;  83:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  84:  &lt;/SPAN&gt;            _thread = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Thread(() =&amp;gt;
&lt;SPAN class=lnum&gt;  85:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  86:  &lt;/SPAN&gt;                _lock.WaitOne();
&lt;SPAN class=lnum&gt;  87:  &lt;/SPAN&gt;                _threadStarted.Set();
&lt;SPAN class=lnum&gt;  88:  &lt;/SPAN&gt;                _threadStop.WaitOne();
&lt;SPAN class=lnum&gt;  89:  &lt;/SPAN&gt;            });
&lt;SPAN class=lnum&gt;  90:  &lt;/SPAN&gt;            _thread.Start();
&lt;SPAN class=lnum&gt;  91:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  92:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  93:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Dispose()
&lt;SPAN class=lnum&gt;  94:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  95:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (_thread != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
&lt;SPAN class=lnum&gt;  96:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  97:  &lt;/SPAN&gt;                _thread.Abort();
&lt;SPAN class=lnum&gt;  98:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  99:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt; 100:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt; 101:  &lt;/SPAN&gt;        [Fact(Timeout = 1000)]
&lt;SPAN class=lnum&gt; 102:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_throw_exception_when_waited_for()
&lt;SPAN class=lnum&gt; 103:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt; 104:  &lt;/SPAN&gt;            _threadStarted.WaitOne();
&lt;SPAN class=lnum&gt; 105:  &lt;/SPAN&gt;            _threadStop.Set();
&lt;SPAN class=lnum&gt; 106:  &lt;/SPAN&gt;            Assert.Throws&amp;lt;AbandonedMutexException&amp;gt;(() =&amp;gt; { _lock.WaitOne(); });
&lt;SPAN class=lnum&gt; 107:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt; 108:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930596" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item><item><title>2009 Advent Calendar December 23rd</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/23/2009-advent-calendar-december-23rd.aspx</link><pubDate>Wed, 23 Dec 2009 08:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930595</guid><dc:creator>cellfish</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930595.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930595</wfw:commentRss><description>&lt;P&gt;And the last test refactored to remove the slow tests:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Given_a_locked_MutexLock
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; FakeMutexWrapper : MutexWrapper
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; Locked { get; &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; set; }
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; NumberOfLocks { get; &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; set; }
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; NumberOfUnlocks { get; &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; set; }
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Reset()
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;                NumberOfLocks = 0;
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;                NumberOfUnlocks = 0;
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; FakeMutexWrapper()
&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;                Locked = &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;;
&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; WaitOne()
&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (!Locked)
&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;                {
&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;                    Locked = &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;;
&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;                    ++NumberOfLocks;
&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;                }
&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  29:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  30:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; ReleaseMutex()
&lt;SPAN class=lnum&gt;  31:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  32:  &lt;/SPAN&gt;                Locked = &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;;
&lt;SPAN class=lnum&gt;  33:  &lt;/SPAN&gt;                ++NumberOfUnlocks;
&lt;SPAN class=lnum&gt;  34:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  35:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  36:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  37:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; MutexLock&amp;lt;FakeMutexWrapper&amp;gt; _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MutexLock&amp;lt;FakeMutexWrapper&amp;gt;();
&lt;SPAN class=lnum&gt;  38:  &lt;/SPAN&gt;        
&lt;SPAN class=lnum&gt;  39:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Given_a_locked_MutexLock()
&lt;SPAN class=lnum&gt;  40:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  41:  &lt;/SPAN&gt;            _lock.Lock();
&lt;SPAN class=lnum&gt;  42:  &lt;/SPAN&gt;            FakeMutexWrapper.Reset();
&lt;SPAN class=lnum&gt;  43:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  44:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  45:  &lt;/SPAN&gt;        [Fact]
&lt;SPAN class=lnum&gt;  46:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_not_take_the_lock()
&lt;SPAN class=lnum&gt;  47:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  48:  &lt;/SPAN&gt;            _lock.Lock();
&lt;SPAN class=lnum&gt;  49:  &lt;/SPAN&gt;            Assert.Equal(0, FakeMutexWrapper.NumberOfLocks);
&lt;SPAN class=lnum&gt;  50:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  51:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  52:  &lt;/SPAN&gt;        [Fact]
&lt;SPAN class=lnum&gt;  53:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_take_lock_when_released()
&lt;SPAN class=lnum&gt;  54:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  55:  &lt;/SPAN&gt;            _lock.Unlock();
&lt;SPAN class=lnum&gt;  56:  &lt;/SPAN&gt;            _lock.Lock();
&lt;SPAN class=lnum&gt;  57:  &lt;/SPAN&gt;            Assert.Equal(1, FakeMutexWrapper.NumberOfLocks);
&lt;SPAN class=lnum&gt;  58:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  59:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;
&lt;P&gt;So great! We now have fast test. But... Once again we're not testing the MutexWrapper. We'll take a look at that tomorrow.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930595" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item><item><title>2009 Advent Calendar December 22nd</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/22/2009-advent-calendar-december-22nd.aspx</link><pubDate>Tue, 22 Dec 2009 08:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930592</guid><dc:creator>cellfish</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930592.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930592</wfw:commentRss><description>&lt;P&gt;And today we refactor yet another test that is potentially slow when failing (because of the timeout):&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Given_an_unlocked_MutexLock
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; MutexWrapperAlwaysUnlocked : MutexWrapper
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; NumberOfLocks { get; set; }
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; WaitOne()
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;                ++NumberOfLocks;
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; ReleaseMutex()
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; MutexLock&amp;lt;MutexWrapperAlwaysUnlocked&amp;gt; _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MutexLock&amp;lt;MutexWrapperAlwaysUnlocked&amp;gt;();
&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Given_an_unlocked_MutexLock()
&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;            MutexWrapperAlwaysUnlocked.NumberOfLocks = 0;
&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;        [Fact]
&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_be_possible_to_lock()
&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;            _lock.Lock();
&lt;SPAN class=lnum&gt;  29:  &lt;/SPAN&gt;            Assert.Equal(1, MutexWrapperAlwaysUnlocked.NumberOfLocks);
&lt;SPAN class=lnum&gt;  30:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  31:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930592" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item><item><title>2009 Advent Calendar December 21st</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/21/2009-advent-calendar-december-21st.aspx</link><pubDate>Mon, 21 Dec 2009 08:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930590</guid><dc:creator>cellfish</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930590.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930590</wfw:commentRss><description>&lt;P&gt;The change we did &lt;A href="http://blogs.msdn.com/cellfish/archive/2009/12/20/2009-advent-calendar-december-20th.aspx" mce_href="http://blogs.msdn.com/cellfish/archive/2009/12/20/2009-advent-calendar-december-20th.aspx"&gt;yesterday&lt;/A&gt; makes it possible to remove the use of helper threads and timeouts for the MutexLock tests. Here is a first refactoring:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Given_an_abandoned_lock
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; MutexWrapperAlwaysAbandoned : MutexWrapper
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; WaitOne()
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;throw&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; AbandonedMutexException();
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; MutexLock&amp;lt;MutexWrapperAlwaysAbandoned&amp;gt; _lock;
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;        
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Given_an_abandoned_lock()
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;            _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MutexLock&amp;lt;MutexWrapperAlwaysAbandoned&amp;gt;();
&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;        [Fact]
&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_be_possible_to_take_lock_when_thread_dies()
&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;            Assert.DoesNotThrow(() =&amp;gt; { _lock.Lock(); });
&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930590" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item><item><title>2009 Advent Calendar December 20th</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/20/2009-advent-calendar-december-20th.aspx</link><pubDate>Sun, 20 Dec 2009 08:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930584</guid><dc:creator>cellfish</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930584.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930584</wfw:commentRss><description>&lt;P&gt;But wait! What happened &lt;A href="http://blogs.msdn.com/cellfish/archive/2009/12/19/2009-advent-calendar-december-19th.aspx" mce_href="http://blogs.msdn.com/cellfish/archive/2009/12/19/2009-advent-calendar-december-19th.aspx"&gt;yesterday&lt;/A&gt;? We added some significant functionality; hiding the fact that AbandonedMutexException might be thrown. Because of this I want to break out the Mutex implementation into a separate, thin wrapper for the Mutex object:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; MutexWrapper
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;readonly&lt;/SPAN&gt; Mutex _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Mutex();
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; WaitOne() 
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;            _lock.WaitOne(); 
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; ReleaseMutex()
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;            _lock.ReleaseMutex();
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;
&lt;P&gt;Given that I use generics to inject the dependency:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; MutexLock&amp;lt;T&amp;gt; : Lock &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; T : MutexWrapper, &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt;()
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;readonly&lt;/SPAN&gt; T _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; T();
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Lock()
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;try&lt;/SPAN&gt;
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;                _lock.WaitOne();
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;catch&lt;/SPAN&gt; (AbandonedMutexException) { }
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Unlock()
&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;            _lock.ReleaseMutex();
&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;
&lt;P&gt;I'll spare you the changes needed to make the tests compile for now since the use of MutexWrapper makes it possible to remove all those helper threads and slow tests for the MutexLock class.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930584" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item><item><title>2009 Advent Calendar December 19th</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/19/2009-advent-calendar-december-19th.aspx</link><pubDate>Sat, 19 Dec 2009 08:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930580</guid><dc:creator>cellfish</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930580.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930580</wfw:commentRss><description>&lt;P&gt;So far so good but there is one more thing I want the MutexLock to do. The &lt;A href="http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx"&gt;Mutex object&lt;/A&gt; may throw an exception (AbandonedMutexException) when being waited for if the current owning thread terminates without releasing the mutex. I want to hide that fact in my MutexLock so I don't need to handle that exception everywhere in my code:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Given_an_abandoned_lock : IDisposable
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; MutexLock _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MutexLock();
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; EventWaitHandle _threadStarted = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; EventWaitHandle(&lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;, EventResetMode.ManualReset);
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; EventWaitHandle _threadStop = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; EventWaitHandle(&lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;, EventResetMode.ManualReset);
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Thread _thread;
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Given_an_abandoned_lock()
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;            _thread = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Thread(() =&amp;gt;
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;                _lock.Lock();
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;                _threadStarted.Set();
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;                _threadStop.WaitOne();
&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;            });
&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;            _thread.Start();
&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Dispose()
&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (_thread != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;                _thread.Abort();
&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;        [Fact(Timeout=1000)]
&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_be_possible_to_take_lock_when_thread_dies()
&lt;SPAN class=lnum&gt;  29:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  30:  &lt;/SPAN&gt;            _threadStarted.WaitOne();
&lt;SPAN class=lnum&gt;  31:  &lt;/SPAN&gt;            _threadStop.Set();
&lt;SPAN class=lnum&gt;  32:  &lt;/SPAN&gt;            Assert.DoesNotThrow(() =&amp;gt; { _lock.Lock(); });
&lt;SPAN class=lnum&gt;  33:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  34:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;
&lt;P&gt;And that test leads to the following implementation:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; MutexLock : Lock
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;readonly&lt;/SPAN&gt; Mutex _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Mutex();
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Lock()
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;try&lt;/SPAN&gt;
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;                _lock.WaitOne();
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;catch&lt;/SPAN&gt; (AbandonedMutexException) {}
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Unlock()
&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;            _lock.ReleaseMutex();
&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930580" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item><item><title>2009 Advent Calendar December 18th</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/18/2009-advent-calendar-december-18th.aspx</link><pubDate>Fri, 18 Dec 2009 08:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930571</guid><dc:creator>cellfish</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930571.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930571</wfw:commentRss><description>&lt;P&gt;Yet another passing test to make sure our MutexLock works as expected:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Given_a_locked_MutexLock : IDisposable
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; MutexLock _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MutexLock();
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Thread _thread;
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; _gotLock = &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;;
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Given_a_locked_MutexLock()
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;            _thread = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Thread(() =&amp;gt;
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;                _lock.Lock();
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;                _gotLock = &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;;
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;                _lock.Unlock();
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;            });
&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Dispose()
&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (_thread != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;                _thread.Abort();
&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; TakeLockAndStartThread()
&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;            _lock.Lock();
&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;            _thread.Start();
&lt;SPAN class=lnum&gt;  29:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  30:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  31:  &lt;/SPAN&gt;        [Fact(Timeout = 1000)]
&lt;SPAN class=lnum&gt;  32:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_not_take_the_lock()
&lt;SPAN class=lnum&gt;  33:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  34:  &lt;/SPAN&gt;            TakeLockAndStartThread();
&lt;SPAN class=lnum&gt;  35:  &lt;/SPAN&gt;            Assert.False(_thread.Join(250));
&lt;SPAN class=lnum&gt;  36:  &lt;/SPAN&gt;            Assert.False(_gotLock);
&lt;SPAN class=lnum&gt;  37:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  38:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  39:  &lt;/SPAN&gt;        [Fact(Timeout = 1000)]
&lt;SPAN class=lnum&gt;  40:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_take_lock_when_released()
&lt;SPAN class=lnum&gt;  41:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  42:  &lt;/SPAN&gt;            TakeLockAndStartThread();
&lt;SPAN class=lnum&gt;  43:  &lt;/SPAN&gt;            Assert.False(_thread.Join(250));
&lt;SPAN class=lnum&gt;  44:  &lt;/SPAN&gt;            _lock.Unlock();
&lt;SPAN class=lnum&gt;  45:  &lt;/SPAN&gt;            Assert.True(_thread.Join(500));
&lt;SPAN class=lnum&gt;  46:  &lt;/SPAN&gt;            Assert.True(_gotLock);
&lt;SPAN class=lnum&gt;  47:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  48:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;
&lt;P&gt;Note that I moved taking the lock from the constructor to a common helper method. This has to do with how xUnit.net runner&amp;nbsp;creates objects and &lt;A href="http://xunit.codeplex.com/WorkItem/View.aspx?WorkItemId=9646" target=_blank mce_href="http://xunit.codeplex.com/WorkItem/View.aspx?WorkItemId=9646"&gt;runs tests together with a timeout&lt;/A&gt;. Turns out that the object is created in one thread and then&amp;nbsp;the test method is run in a separate thread if a timeout is used. In theory, if everything works as expected I don't really need the timeout but it is very nice to have it just in&amp;nbsp;case the code doesn't work as expected.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930571" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item><item><title>2009 Advent Calendar December 17th</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/17/2009-advent-calendar-december-17th.aspx</link><pubDate>Thu, 17 Dec 2009 08:17:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930565</guid><dc:creator>cellfish</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930565.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930565</wfw:commentRss><description>&lt;P&gt;Since we already have an implementation for the MutexLock I want to add another passing test:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Given_a_locked_MutexLock : IDisposable
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; MutexLock _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MutexLock();
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Thread _thread;
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; _gotLock = &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;;
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Given_a_locked_MutexLock()
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;            _lock.Lock();
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;            _thread = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Thread(() =&amp;gt;
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;                _lock.Lock();
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;                _gotLock = &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;;
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;                _lock.Unlock();
&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;            });
&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;            _thread.Start();
&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;            
&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Dispose()
&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (_thread != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;                _thread.Abort();
&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;        [Fact(Timeout = 1000)]
&lt;SPAN class=lnum&gt;  29:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_not_take_the_lock()
&lt;SPAN class=lnum&gt;  30:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  31:  &lt;/SPAN&gt;            Assert.False(_thread.Join(250));
&lt;SPAN class=lnum&gt;  32:  &lt;/SPAN&gt;            Assert.False(_gotLock);
&lt;SPAN class=lnum&gt;  33:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  34:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;
&lt;P&gt;It's starting to get tricky using helper threads but let's continue tomorrow...&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930565" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item><item><title>2009 Advent Calendar December 16th</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/16/2009-advent-calendar-december-16th.aspx</link><pubDate>Wed, 16 Dec 2009 08:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930560</guid><dc:creator>cellfish</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930560.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930560</wfw:commentRss><description>&lt;P&gt;So far I'm pretty pleased with how the ImportantObject is protected by the ImportantProvider but we're dealing with thread safety and how can we be sure the MutexLock class really does what it is supposed to do? We should put that class under its own set of tests. So let's start with a simple one:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Given_an_unlocked_MutexLock
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; MutexLock _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MutexLock();
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        [Fact(Timeout=1000)]
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_be_possible_to_lock()
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;            _lock.Lock();
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;
&lt;P&gt;With implementation:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; MutexLock : Lock
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;readonly&lt;/SPAN&gt; Mutex _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Mutex();
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Lock()
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;            _lock.WaitOne();
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Unlock()
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;            _lock.ReleaseMutex();
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930560" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item><item><title>2009 Advent Calendar December 15th</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/15/2009-advent-calendar-december-15th.aspx</link><pubDate>Tue, 15 Dec 2009 08:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930556</guid><dc:creator>cellfish</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930556.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930556</wfw:commentRss><description>&lt;P&gt;So instead of the generic for the lock&amp;nbsp;we had &lt;A href="http://blogs.msdn.com/cellfish/archive/2009/12/14/2009-advent-calendar-december-14th.aspx" mce_href="http://blogs.msdn.com/cellfish/archive/2009/12/14/2009-advent-calendar-december-14th.aspx"&gt;yesterday&lt;/A&gt; we can add a default constructor for convenience in the code and keep the constructor injection for the test code:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; ImportantProvider&amp;lt;T&amp;gt; &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; T : ImportantInterface, &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt;()
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; T _importantObject = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; T();
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Lock _lock;
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ImportantProvider() : &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MutexLock())
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;            
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ImportantProvider(Lock aLock)
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;            _lock = aLock;
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Transaction Transaction
&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;            get
&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Transaction(_importantObject, _lock);
&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930556" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item><item><title>2009 Advent Calendar December 14th</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/14/2009-advent-calendar-december-14th.aspx</link><pubDate>Mon, 14 Dec 2009 08:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930548</guid><dc:creator>cellfish</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930548.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930548</wfw:commentRss><description>&lt;P&gt;But if we're using generics; why not do it for the lock too:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; ImportantProvider&amp;lt;T,L&amp;gt; &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; T : ImportantInterface, &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt;() &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; L : Lock,&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt;()
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; T _importantObject = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; T();
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; L _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; L();
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Transaction Transaction
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;            get
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Transaction(_importantObject, _lock);
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;
&lt;P&gt;But that leads to test code with static fields for verification. And&amp;nbsp;I didn't like that &lt;A href="http://blogs.msdn.com/cellfish/archive/2009/12/02/2009-advent-calendar-december-2nd.aspx" mce_href="http://blogs.msdn.com/cellfish/archive/2009/12/02/2009-advent-calendar-december-2nd.aspx"&gt;before&lt;/A&gt; either... So it is a good idea to back that change out event though the ImportantProvider looks very neat with it IMHO.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930548" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item><item><title>2009 Advent Calendar December 13th</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/13/2009-advent-calendar-december-13th.aspx</link><pubDate>Sun, 13 Dec 2009 08:13:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930543</guid><dc:creator>cellfish</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930543.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930543</wfw:commentRss><description>&lt;P&gt;One&amp;nbsp;problem I see with how ImportantProvider turned out &lt;A href="http://blogs.msdn.com/cellfish/archive/2009/12/12/2009-advent-calendar-december-12th.aspx" mce_href="http://blogs.msdn.com/cellfish/archive/2009/12/12/2009-advent-calendar-december-12th.aspx"&gt;yesterday&lt;/A&gt; is that I have to give it the ImportantObject to provide. Hence I cannot be sure that all use of the ImportantObject is protected by the provider in the future. It is still too easy to bypass the thread safe ImportantProvider. We can fix this by using generics:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; ImportantProvider&amp;lt;T&amp;gt; &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; T : ImportantInterface,&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt;()
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; T _importantObject = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; T();
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Lock _lock;
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ImportantProvider(Lock aLock)
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;            _lock = aLock;
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Transaction Transaction
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;            get
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Transaction(_importantObject, _lock);
&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;
&lt;P&gt;And here is an example of how it is used in the tests:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;       _importantProvider = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ImportantProvider&amp;lt;DummyObject&amp;gt;(_lock);
&lt;/DIV&gt;&lt;/PRE&gt;
&lt;P&gt;Combine this by making the ImportantObject internal and keep it in an assembly with the provider and we know that nobody will use ImportantObject in an unsafe way (from a thread safety perspective).&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930543" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item><item><title>2009 Advent Calendar December 12th</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/12/2009-advent-calendar-december-12th.aspx</link><pubDate>Sat, 12 Dec 2009 08:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930052</guid><dc:creator>cellfish</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930052.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930052</wfw:commentRss><description>&lt;P&gt;So now we need to fix the broken ImportantProvider making sure it uses one lock:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Given_two_transactions_from_the_same_ImportantProvider
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; FakeLock _lock;
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; ImportantProvider _importantProvider;
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Transaction _transaction1;
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Transaction _transaction2;
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Given_two_transactions_from_the_same_ImportantProvider()
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;            _lock = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; FakeLock();
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;            _importantProvider = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ImportantProvider(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; DummyObject(), _lock);
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;            _transaction1 = _importantProvider.Transaction;
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;            _transaction2 = _importantProvider.Transaction;
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;        [Fact]
&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_be_two_different_transactions()
&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;            Assert.NotSame(_transaction1, _transaction2);
&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;        [Fact]
&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_be_the_same_ImportantObject_returned_by_both_transactions()
&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;            Assert.Same(_transaction1.ImportantObject, _transaction2.ImportantObject);
&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;        [Fact]
&lt;SPAN class=lnum&gt;  29:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_take_lock_once_for_each_transaction()
&lt;SPAN class=lnum&gt;  30:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  31:  &lt;/SPAN&gt;            Assert.Equal(2, _lock.NumberOfLocks);
&lt;SPAN class=lnum&gt;  32:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  33:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;
&lt;P&gt;As you can see in the test I've chosen constructor injection for the lock in this case:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; ImportantProvider
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; ImportantInterface _importantObject;
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Lock _lock;
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ImportantProvider(ImportantInterface importantObject, Lock aLock)
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;            _lock = aLock;
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;            _importantObject = importantObject;
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Transaction Transaction
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;            get
&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;            {
&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Transaction(_importantObject, _lock);
&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;            }
&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930052" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item><item><title>2009 Advent Calendar December 11th</title><link>http://blogs.msdn.com/cellfish/archive/2009/12/11/2009-advent-calendar-december-11th.aspx</link><pubDate>Fri, 11 Dec 2009 08:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930049</guid><dc:creator>cellfish</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/cellfish/comments/9930049.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cellfish/commentrss.aspx?PostID=9930049</wfw:commentRss><description>&lt;P&gt;Like yesterday I only have a passing test to add today:&lt;/P&gt;&lt;PRE&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;DIV class=csharpcode&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Given_two_transactions_from_the_same_ImportantProvider
&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;    {
&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; ImportantProvider _importantProvider;
&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Transaction _transaction1;
&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Transaction _transaction2;
&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Given_two_transactions_from_the_same_ImportantProvider()
&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;            _importantProvider = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ImportantProvider(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; DummyObject());
&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;            _transaction1 = _importantProvider.Transaction;
&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;            _transaction2 = _importantProvider.Transaction;
&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;        [Fact]
&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_be_two_different_transactions()
&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;            Assert.NotSame(_transaction1, _transaction2);
&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;&amp;nbsp;
&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;        [Fact]
&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; It_should_be_the_same_ImportantObject_returned_by_both_transactions()
&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;        {
&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;            Assert.Same(_transaction1.ImportantObject, _transaction2.ImportantObject);
&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;        }
&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;    }
&lt;/DIV&gt;&lt;/PRE&gt;
&lt;P&gt;You might have noticed that the ImportantProvider creates a new lock for each transaction. That is no good. Tomorrow I'll fix that.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930049" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cellfish/archive/tags/Christmas/default.aspx">Christmas</category></item></channel></rss>