<?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>Donkblog : .NET</title><link>http://blogs.msdn.com/brandonturner/archive/tags/.NET/default.aspx</link><description>Tags: .NET</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>A little early, but who is keeping score? Timers!</title><link>http://blogs.msdn.com/brandonturner/archive/2008/04/28/a-little-early-but-who-is-keeping-score-timers.aspx</link><pubDate>Mon, 28 Apr 2008 18:03:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8435515</guid><dc:creator>Brandon Turner</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/brandonturner/comments/8435515.aspx</comments><wfw:commentRss>http://blogs.msdn.com/brandonturner/commentrss.aspx?PostID=8435515</wfw:commentRss><description>&lt;p&gt;I ran into a problem the other day at work where I had put in an assert to verify that a timer I was using was not being called back too early.&amp;#160; The timer interval was adjusted depending on user interaction and I just wanted to make sure interval was always being set correctly. &lt;/p&gt;  &lt;p&gt;For the most part everything was fine, however I started to get reports that the assert started to show up every once and a while.&amp;#160;&amp;#160; I ended up removing the assert because the callback time and the expected callback time were so close it didn’t matter in my case.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;This intrigued me though. So I wrote a little test program to make sure that it wasn’t a problem with my code, and I copied the relevant part of the that test application here:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="overflow: scroll"&gt;   &lt;pre class="csharpcode"&gt;DateTime _startTime;
Timer _currentTimer;
&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; button1_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
{
    StartTimer();
}

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; StartTimer()
{
    _currentTimer = &lt;span class="kwrd"&gt;new&lt;/span&gt; Timer();
    _startTime = DateTime.Now;
    _currentTimer.Interval = 1000;
    _currentTimer.Tick += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(t_Tick);
    _currentTimer.Start();
}

&lt;span class="kwrd"&gt;void&lt;/span&gt; t_Tick(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
{
    &lt;span class="rem"&gt;// What time is it now?&lt;/span&gt;
    DateTime now = DateTime.Now;

    &lt;span class="rem"&gt;// Add the interval to the time when we started the timer, &lt;/span&gt;
    &lt;span class="rem"&gt;// this is the earliest possible&lt;/span&gt;
    &lt;span class="rem"&gt;// time we should be called back&lt;/span&gt;
    DateTime minCallbackTime = _startTime.AddMilliseconds(1000);

    &lt;span class="rem"&gt;// Check to see if the time we though was &lt;/span&gt;
    &lt;span class="rem"&gt;// first possible to call back is greater then&lt;/span&gt;
    &lt;span class="rem"&gt;// the current time we were called back to make &lt;/span&gt;
    &lt;span class="rem"&gt;// sure it isnt in the future.&lt;/span&gt;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (minCallbackTime &amp;gt; now)
    {
        String output = String.Format(&lt;span class="str"&gt;&amp;quot;The minimum callback time was {0} but the current time is {1} with a total difference of {2}&amp;quot;&lt;/span&gt;, 
                                       minCallbackTime, 
                                       now, 
                                       minCallbackTime.Subtract(now).TotalMilliseconds);
        Debug.WriteLine(output);
    }
    &lt;span class="kwrd"&gt;else&lt;/span&gt;
    {
        Debug.WriteLine(&lt;span class="str"&gt;&amp;quot;All is quiet on the western front.&amp;quot;&lt;/span&gt;);
    }

    _currentTimer.Dispose();

    &lt;span class="rem"&gt;// Start the process again&lt;/span&gt;
    StartTimer();
} &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;The log looked like: &lt;/p&gt;

&lt;p&gt;The minimum callback time was 4/27/2008 5:09:21 PM but the current time is 4/27/2008 5:09:21 PM with a total difference of 2.9935 
  &lt;br /&gt;The minimum callback time was 4/27/2008 5:09:22 PM but the current time is 4/27/2008 5:09:22 PM with a total difference of 1.0405 

  &lt;br /&gt;All is quiet on the western front. 

  &lt;br /&gt;All is quiet on the western front. 

  &lt;br /&gt;The minimum callback time was 4/27/2008 5:09:25 PM but the current time is 4/27/2008 5:09:25 PM with a total difference of &lt;strong&gt;10.8055 
    &lt;br /&gt;&lt;/strong&gt;The minimum callback time was 4/27/2008 5:09:26 PM but the current time is 4/27/2008 5:09:26 PM with a total difference of 0.064 

  &lt;br /&gt;The minimum callback time was 4/27/2008 5:09:27 PM but the current time is 4/27/2008 5:09:27 PM with a total difference of 1.0405&lt;/p&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 .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8435515" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/brandonturner/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Assembly Version - Odds and Ends</title><link>http://blogs.msdn.com/brandonturner/archive/2008/03/11/assembly-version-odds-and-ends.aspx</link><pubDate>Tue, 11 Mar 2008 17:16:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8153098</guid><dc:creator>Brandon Turner</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/brandonturner/comments/8153098.aspx</comments><wfw:commentRss>http://blogs.msdn.com/brandonturner/commentrss.aspx?PostID=8153098</wfw:commentRss><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;What's the Assembly Version Good For?&lt;/h3&gt;  &lt;p&gt;Using assembly version is a wonderful way for someone to help maintain and support their applications.&amp;#160; It is defined in the AssemblyInfo.cs file through an attribute.&amp;#160; You can manually update it or have a auto incrementing process to control your assembly version.&amp;#160; It is a good idea to display it on an 'About Dialog' so users can report it when they suggest new features or find bugs.&lt;/p&gt;  &lt;h3&gt;How Do I Retrieve the Assembly Version?&lt;/h3&gt;  &lt;p&gt;From a console application the version number can be retrieved by:&lt;/p&gt;  &lt;h5&gt;System.Reflection.Assembly.GetExecutingAssembly().GetName().Version&lt;/h5&gt;  &lt;p&gt;And from an application that loads the System.Windows.Forms library it can by retrieved by:&lt;/p&gt;  &lt;h5&gt;new Version(Application.ProductVersion)&lt;/h5&gt;  &lt;p&gt;Both of these calls will take about 10ms to run the first time, but the results will be cached for future calls.&lt;/p&gt;  &lt;h3&gt;Tell Me Something Weird!&lt;/h3&gt;  &lt;p&gt;If you don't define an assembly version the first method will return 0.0.0.0 and the 2nd method will return 1.0.0.0.&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8153098" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/brandonturner/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Lazy Loading for the Lazy Coder</title><link>http://blogs.msdn.com/brandonturner/archive/2008/03/07/lazy-loading-for-the-lazy-coder.aspx</link><pubDate>Fri, 07 Mar 2008 18:08:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8099440</guid><dc:creator>Brandon Turner</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/brandonturner/comments/8099440.aspx</comments><wfw:commentRss>http://blogs.msdn.com/brandonturner/commentrss.aspx?PostID=8099440</wfw:commentRss><description>&lt;p&gt;Lazy loading in properties is very common.&amp;#160; It is a relativity simple concept of only loading the data you once you actually need it, instead of front loading it all.&amp;#160; Though the problem with doing this all over the place is that you end up copying and pasting code a lot to do it.&amp;#160; And we all know how much &lt;a href="http://ieeexplore.ieee.org/Xplore/login.jsp?url=/iel5/32/33822/01610609.pdf?arnumber=1610609"&gt;copying and pasting code can lead to bugs&lt;/a&gt; and convoluted code.&lt;/p&gt;  &lt;p&gt;In order to allow for the benefits of lazy loading but also to make the code a bit cleaner I made a class to help with it.&amp;#160; The class is slightly under developed in the fact that it can't be used in all cases, but it is more a proof of concept of what can be done to help.&amp;#160; As I use the class more and need it to do more things I'm sure I will expand it and adapt it to my needs.&amp;#160; I strongly encourage everyone to see if something like this could help their code.&lt;/p&gt;  &lt;p&gt;Below I have the code for the class.&amp;#160; Then following that is code to show an example of code that doesn't use it and the same code that does use it.&lt;/p&gt;  &lt;p&gt;&amp;#160;&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; LazyLoader&amp;lt;T&amp;gt;
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; T LazyLoaderDelegate();
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt;? isInit = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
    &lt;span class="kwrd"&gt;private&lt;/span&gt; T _value;
    &lt;span class="kwrd"&gt;private&lt;/span&gt; LazyLoaderDelegate _valueCalculator;

    &lt;span class="kwrd"&gt;public&lt;/span&gt; LazyLoader(LazyLoaderDelegate valueCalculator)
    {
        _valueCalculator = valueCalculator;
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; T Value
    {
        get
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (isInit != &lt;span class="kwrd"&gt;true&lt;/span&gt;)
            {
                _value = _valueCalculator();
                isInit = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; _value;
        }
        set
        {
            _value = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
            isInit = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
        }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Clear()
    {
        isInit = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
    }

} &lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&lt;strong&gt;Code that doesn't use the lazy loading class:&lt;/strong&gt;&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; WidgetCounter
{
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; _numberOfWidgets;
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; _numberOfWidgetsInit;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; NumberOfWidgets 
    {
        get
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (_numberOfWidgetsInit == &lt;span class="kwrd"&gt;false&lt;/span&gt;)
            {
                _numberOfWidgets = GetValue();
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; _numberOfWidgets;
        }
        set
        {
            _numberOfWidgets = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
            _numberOfWidgetsInit = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
        }
    }

    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; GetValue()
    {
        &lt;span class="rem"&gt;// Do some really time consuming operation&lt;/span&gt;
        Thread.Sleep(1000);
        &lt;span class="kwrd"&gt;return&lt;/span&gt; 5;
    }

}&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&lt;strong&gt;Code uses the lazy loading class:&lt;/strong&gt;&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; WidgetCounter
{
    &lt;span class="kwrd"&gt;private&lt;/span&gt; LazyLoader&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; _numberOfWidgets;

    &lt;span class="kwrd"&gt;public&lt;/span&gt; WidgetCounter()
    {
        _numberOfWidgets = &lt;span class="kwrd"&gt;new&lt;/span&gt; LazyLoader&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;(&lt;span class="kwrd"&gt;delegate&lt;/span&gt; { &lt;span class="kwrd"&gt;return&lt;/span&gt; GetValue(); });
    }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; NumberOfWidgets
    {
        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _numberOfWidgets.Value; }
        set { _numberOfWidgets = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }
    }

    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; GetValue()
    {
        &lt;span class="rem"&gt;// Do some really time consuming operation&lt;/span&gt;
        Thread.Sleep(1000);
        &lt;span class="kwrd"&gt;return&lt;/span&gt; 5;
    }

}&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;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8099440" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/brandonturner/archive/tags/.NET/default.aspx">.NET</category></item><item><title>The Dangers Of Exception Based Logic Part 1 - Parsing Integers</title><link>http://blogs.msdn.com/brandonturner/archive/2008/03/03/the-dangers-of-exception-based-logic-part-1-parsing-integers.aspx</link><pubDate>Mon, 03 Mar 2008 17:59:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8003315</guid><dc:creator>Brandon Turner</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/brandonturner/comments/8003315.aspx</comments><wfw:commentRss>http://blogs.msdn.com/brandonturner/commentrss.aspx?PostID=8003315</wfw:commentRss><description>&lt;p&gt;Exception based logic is one of those things that actually makes me cringe when I see it.&amp;#160; Often times it is really easy to avoid like in the case below.&amp;#160; Believe it or not, exceptions in .NET aren't cheap and shouldn't be taken for granted.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Exception Based Logic:&amp;#160;&amp;#160;&amp;#160;&amp;#160; 14-19ms&lt;/p&gt;  &lt;p&gt;Try Function Based Logic: 0ms&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
{
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (&lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;a href="http://jcheng.wordpress.com/2007/10/23/code-sample-quicktimer-2/"&gt;QuickTimer&lt;/a&gt;(&lt;span class="str"&gt;&amp;quot;Exception Based Logic&amp;quot;&lt;/span&gt;))
    {
         &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 10; i++)
         {
             &lt;span class="kwrd"&gt;try&lt;/span&gt;
             {
                 &lt;span class="kwrd"&gt;int&lt;/span&gt; j = Int32.Parse(&lt;span class="str"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;);
             } &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
             {
                 Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Error&amp;quot;&lt;/span&gt;);
             }
         }
    }

    &lt;span class="kwrd"&gt;using&lt;/span&gt; (&lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;a href="http://jcheng.wordpress.com/2007/10/23/code-sample-quicktimer-2/"&gt;QuickTimer&lt;/a&gt;(&lt;span class="str"&gt;&amp;quot;Try Function Based Logic&amp;quot;&lt;/span&gt;))
    {
         &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 10; i++)
         {
              &lt;span class="kwrd"&gt;int&lt;/span&gt; j = 0;
              &lt;span class="kwrd"&gt;if&lt;/span&gt; (!Int32.TryParse(&lt;span class="str"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;,&lt;span class="kwrd"&gt;out&lt;/span&gt; j))
              {
                  Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Error&amp;quot;&lt;/span&gt;);
              }
         }
      }
}&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;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8003315" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/brandonturner/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/brandonturner/archive/tags/.NET/default.aspx">.NET</category></item></channel></rss>