<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Works on my machine</title>
        <link>http://geekswithblogs.net/nabuk/Default.aspx</link>
        <description> </description>
        <language>en-US</language>
        <copyright>Jakub Niemyjski</copyright>
        <managingEditor>kubanvip@gmail.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <image>
            <title>Works on my machine</title>
            <url>http://geekswithblogs.net/images/RSS2Image.gif</url>
            <link>http://geekswithblogs.net/nabuk/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>Overuse of &amp;ldquo;as&amp;rdquo; keyword</title>
            <category>C#</category>
            <link>http://geekswithblogs.net/nabuk/archive/2012/12/22/overuse-of-ldquoasrdquo-keyword.aspx</link>
            <description>&lt;p&gt;Originally posted on: &lt;a href='http://geekswithblogs.net/nabuk/archive/2012/12/22/overuse-of-ldquoasrdquo-keyword.aspx'&gt;http://geekswithblogs.net/nabuk/archive/2012/12/22/overuse-of-ldquoasrdquo-keyword.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Recently I realized that I am overusing "as" keyword. It is probably because its syntax is more fluent for me than ordinary cast. I see this overuse even in Microsoft examples. Let the following code show you what I mean:&lt;/p&gt; &lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;  &lt;div style="line-height: 12px; background-color: #333; font-family: consolas, courier; word-wrap: break-word; color: #fff"&gt;   &lt;pre&gt;&lt;span style="color: #2b91af"&gt;  1:&lt;/span&gt;  &lt;span style="color: #00aaff"&gt;object&lt;/span&gt; x = &lt;span style="color: #e0551d"&gt;"1.0"&lt;/span&gt;;
&lt;span style="color: #2b91af"&gt;  2:&lt;/span&gt;  Version v = x &lt;span style="color: #00aaff"&gt;as&lt;/span&gt; Version;
&lt;span style="color: #2b91af"&gt;  3:&lt;/span&gt;  Console.WriteLine(v.Major);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;and just for reference reasons ordinary cast:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div style="line-height: 12px; background-color: #333; font-family: consolas, courier; word-wrap: break-word; color: #fff"&gt;
  &lt;pre&gt;&lt;span style="color: #2b91af"&gt;  1:&lt;/span&gt;  &lt;span style="color: #00aaff"&gt;object&lt;/span&gt; x = &lt;span style="color: #e0551d"&gt;"1.0"&lt;/span&gt;;
&lt;span style="color: #2b91af"&gt;  2:&lt;/span&gt;  Version v = (Version)x;
&lt;span style="color: #2b91af"&gt;  3:&lt;/span&gt;  Console.WriteLine(v.Major);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;When you run first snippet it will crash on third line throwing NullReferenceException. 
  &lt;br /&gt;Second snippet on the other hand will crash on second line throwing InvalidCastException.&lt;/p&gt;

&lt;p&gt;Now tell me, which gives you more info ?&lt;/p&gt;

&lt;p&gt;For me the real problem with first one is that it can misguide in more complex scenarios. Imagine a method that returns some reference type and the last action is cast. What would be your first thought when your consuming code throws NullReferenceException ? That was my scenario and frankly I lost too much time analyzing good code. If I had only got InvalidCastException in proper line …&lt;/p&gt; &lt;img src="http://geekswithblogs.net/nabuk/aggbug/151626.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jakub Niemyjski</dc:creator>
            <guid>http://geekswithblogs.net/nabuk/archive/2012/12/22/overuse-of-ldquoasrdquo-keyword.aspx</guid>
            <pubDate>Sat, 22 Dec 2012 15:34:15 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/nabuk/comments/151626.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/nabuk/archive/2012/12/22/overuse-of-ldquoasrdquo-keyword.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/nabuk/comments/commentRss/151626.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Beware the IEnumerable&amp;lt;T&amp;gt;</title>
            <category>C#</category>
            <category>Linq</category>
            <link>http://geekswithblogs.net/nabuk/archive/2012/10/31/beware-the-ienumerablelttgt.aspx</link>
            <description>&lt;p&gt;Originally posted on: &lt;a href='http://geekswithblogs.net/nabuk/archive/2012/10/31/beware-the-ienumerablelttgt.aspx'&gt;http://geekswithblogs.net/nabuk/archive/2012/10/31/beware-the-ienumerablelttgt.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you see IEnumerable&amp;lt;T&amp;gt; as read only collection crippled brother, this post is for you.&lt;/p&gt;  &lt;p&gt;Many times I found myself loosing couple of hours looking for a bug everywhere, but not in a place where it was. From time to time the bug is caused by my simplified perception of IEnumerable. The thing is, if we do not know the mechanism that serves specific IEnumerable elements, we cannot be sure that each iteration will return equal collections with same objects.&lt;/p&gt;  &lt;p&gt;It is not a big deal if it hosts immutable objects. With mutable however, we must be careful.&lt;/p&gt;  &lt;p&gt;Let’s analyze following properties:&lt;/p&gt; &lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;  &lt;div style="line-height: 12px; background-color: #333; font-family: consolas, courier; word-wrap: break-word; color: #fff"&gt;   &lt;pre&gt;&lt;span style="color: #2b91af"&gt;  1:&lt;/span&gt;  &lt;span style="color: #00aaff"&gt;public&lt;/span&gt; &lt;span style="color: #00aaff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;StringBuilder&amp;gt; ByArray
&lt;span style="color: #2b91af"&gt;  2:&lt;/span&gt;  {
&lt;span style="color: #2b91af"&gt;  3:&lt;/span&gt;      get
&lt;span style="color: #2b91af"&gt;  4:&lt;/span&gt;      {
&lt;span style="color: #2b91af"&gt;  5:&lt;/span&gt;          &lt;span style="color: #00aaff"&gt;return&lt;/span&gt; &lt;span style="color: #00aaff"&gt;new&lt;/span&gt; StringBuilder[] { &lt;span style="color: #00aaff"&gt;new&lt;/span&gt; StringBuilder(&lt;span style="color: #e0551d"&gt;"foo"&lt;/span&gt;) };
&lt;span style="color: #2b91af"&gt;  6:&lt;/span&gt;      }
&lt;span style="color: #2b91af"&gt;  7:&lt;/span&gt;  }
&lt;span style="color: #2b91af"&gt;  8:&lt;/span&gt;  
&lt;span style="color: #2b91af"&gt;  9:&lt;/span&gt;  &lt;span style="color: #00aaff"&gt;public&lt;/span&gt; &lt;span style="color: #00aaff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;StringBuilder&amp;gt; ByYield
&lt;span style="color: #2b91af"&gt; 10:&lt;/span&gt;  {
&lt;span style="color: #2b91af"&gt; 11:&lt;/span&gt;      get
&lt;span style="color: #2b91af"&gt; 12:&lt;/span&gt;      {
&lt;span style="color: #2b91af"&gt; 13:&lt;/span&gt;          &lt;span style="color: #00aaff"&gt;yield&lt;/span&gt; &lt;span style="color: #00aaff"&gt;return&lt;/span&gt; &lt;span style="color: #00aaff"&gt;new&lt;/span&gt; StringBuilder(&lt;span style="color: #e0551d"&gt;"foo"&lt;/span&gt;);
&lt;span style="color: #2b91af"&gt; 14:&lt;/span&gt;      }
&lt;span style="color: #2b91af"&gt; 15:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;and code that operates on them:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div style="line-height: 12px; background-color: #333; font-family: consolas, courier; word-wrap: break-word; color: #fff"&gt;
  &lt;pre&gt;&lt;span style="color: #2b91af"&gt;  1:&lt;/span&gt;  &lt;span style="color: #00aaff"&gt;var&lt;/span&gt; enumerable = ByArray;
&lt;span style="color: #2b91af"&gt;  2:&lt;/span&gt;  enumerable.First()[0] = 'b';
&lt;span style="color: #2b91af"&gt;  3:&lt;/span&gt;  Console.WriteLine(enumerable.First());
&lt;span style="color: #2b91af"&gt;  4:&lt;/span&gt;  
&lt;span style="color: #2b91af"&gt;  5:&lt;/span&gt;  enumerable = ByYield;
&lt;span style="color: #2b91af"&gt;  6:&lt;/span&gt;  enumerable.First()[0] = 'b';
&lt;span style="color: #2b91af"&gt;  7:&lt;/span&gt;  Console.WriteLine(enumerable.First());&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This will write 2 lines. Can you predict each of them ? If not, I strongly advise you to run the code.&lt;/p&gt;

&lt;p&gt;But that is not all. Analyze those two properties:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div style="line-height: 12px; background-color: #333; font-family: consolas, courier; word-wrap: break-word; color: #fff"&gt;
  &lt;pre&gt;&lt;span style="color: #2b91af"&gt;  1:&lt;/span&gt;  &lt;span style="color: #00aaff"&gt;public&lt;/span&gt; &lt;span style="color: #00aaff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;StringBuilder&amp;gt; ByDynamicArray
&lt;span style="color: #2b91af"&gt;  2:&lt;/span&gt;  {
&lt;span style="color: #2b91af"&gt;  3:&lt;/span&gt;      get
&lt;span style="color: #2b91af"&gt;  4:&lt;/span&gt;      {
&lt;span style="color: #2b91af"&gt;  5:&lt;/span&gt;          &lt;span style="color: #00aaff"&gt;return&lt;/span&gt; &lt;span style="color: #00aaff"&gt;new&lt;/span&gt; StringBuilder[] { &lt;span style="color: #00aaff"&gt;new&lt;/span&gt; StringBuilder(&lt;span style="color: #e0551d"&gt;"foo"&lt;/span&gt;) };
&lt;span style="color: #2b91af"&gt;  6:&lt;/span&gt;      }
&lt;span style="color: #2b91af"&gt;  7:&lt;/span&gt;  }
&lt;span style="color: #2b91af"&gt;  8:&lt;/span&gt;  
&lt;span style="color: #2b91af"&gt;  9:&lt;/span&gt;  &lt;span style="color: #00aaff"&gt;public&lt;/span&gt; &lt;span style="color: #00aaff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;StringBuilder&amp;gt; ByStaticArray
&lt;span style="color: #2b91af"&gt; 10:&lt;/span&gt;  {
&lt;span style="color: #2b91af"&gt; 11:&lt;/span&gt;      get
&lt;span style="color: #2b91af"&gt; 12:&lt;/span&gt;      {
&lt;span style="color: #2b91af"&gt; 13:&lt;/span&gt;          &lt;span style="color: #00aaff"&gt;return&lt;/span&gt; fooArray;
&lt;span style="color: #2b91af"&gt; 14:&lt;/span&gt;      }
&lt;span style="color: #2b91af"&gt; 15:&lt;/span&gt;  }
&lt;span style="color: #2b91af"&gt; 16:&lt;/span&gt;  &lt;span style="color: #00aaff"&gt;private&lt;/span&gt; &lt;span style="color: #00aaff"&gt;static&lt;/span&gt; StringBuilder[] fooArray =
&lt;span style="color: #2b91af"&gt; 17:&lt;/span&gt;      &lt;span style="color: #00aaff"&gt;new&lt;/span&gt; StringBuilder[] { &lt;span style="color: #00aaff"&gt;new&lt;/span&gt; StringBuilder(&lt;span style="color: #e0551d"&gt;"foo"&lt;/span&gt;) };
&lt;span style="color: #2b91af"&gt; 18:&lt;/span&gt;  
&lt;span style="color: #2b91af"&gt; 19:&lt;/span&gt;  &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;and their usage:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div style="line-height: 12px; background-color: #333; font-family: consolas, courier; word-wrap: break-word; color: #fff"&gt;
  &lt;pre&gt;&lt;span style="color: #2b91af"&gt;  1:&lt;/span&gt;  ByDynamicArray.First()[0] = 'b';
&lt;span style="color: #2b91af"&gt;  2:&lt;/span&gt;  Console.WriteLine(ByDynamicArray.First());
&lt;span style="color: #2b91af"&gt;  3:&lt;/span&gt;  
&lt;span style="color: #2b91af"&gt;  4:&lt;/span&gt;  ByStaticArray.First()[0] = 'b';
&lt;span style="color: #2b91af"&gt;  5:&lt;/span&gt;  Console.WriteLine(ByStaticArray.First());&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Notice that now we are operating directly on property, not on a local variable like in previous example. This is also important and can cause different output.&lt;/p&gt;

&lt;p&gt;So be careful and think twice before writing code that operates on IEnumerable&amp;lt;T&amp;gt;.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/nabuk/aggbug/151137.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jakub Niemyjski</dc:creator>
            <guid>http://geekswithblogs.net/nabuk/archive/2012/10/31/beware-the-ienumerablelttgt.aspx</guid>
            <pubDate>Tue, 30 Oct 2012 23:23:26 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/nabuk/comments/151137.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/nabuk/archive/2012/10/31/beware-the-ienumerablelttgt.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/nabuk/comments/commentRss/151137.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Linq&amp;rsquo;s ZIP for adjacent items</title>
            <category>Linq</category>
            <category>C#</category>
            <link>http://geekswithblogs.net/nabuk/archive/2012/10/30/linqrsquos-zip-for-adjacent-items.aspx</link>
            <description>&lt;p&gt;Originally posted on: &lt;a href='http://geekswithblogs.net/nabuk/archive/2012/10/30/linqrsquos-zip-for-adjacent-items.aspx'&gt;http://geekswithblogs.net/nabuk/archive/2012/10/30/linqrsquos-zip-for-adjacent-items.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I found that Linq’s ZIP is really great for adjacent item computations.&lt;/p&gt;  &lt;p&gt;For example, let’s have a collection of dates:&lt;/p&gt; &lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;  &lt;div style="line-height: 12px; background-color: #333; font-family: consolas, courier; word-wrap: break-word; color: #fff"&gt;   &lt;pre&gt;&lt;span style="color: #2b91af"&gt;  1:&lt;/span&gt;  &lt;span style="color: #00aaff"&gt;var&lt;/span&gt; dates = &lt;span style="color: #00aaff"&gt;new&lt;/span&gt; DateTime[]
&lt;span style="color: #2b91af"&gt;  2:&lt;/span&gt;  {
&lt;span style="color: #2b91af"&gt;  3:&lt;/span&gt;      &lt;span style="color: #00aaff"&gt;new&lt;/span&gt; DateTime(2000,1,1),
&lt;span style="color: #2b91af"&gt;  4:&lt;/span&gt;      &lt;span style="color: #00aaff"&gt;new&lt;/span&gt; DateTime(2000,1,2),
&lt;span style="color: #2b91af"&gt;  5:&lt;/span&gt;      &lt;span style="color: #00aaff"&gt;new&lt;/span&gt; DateTime(2000,1,5)
&lt;span style="color: #2b91af"&gt;  6:&lt;/span&gt;  };&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;How would you compute time difference of adjacent items ?&lt;/p&gt;

&lt;p&gt;I like to use Zip for this kind of job:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div style="line-height: 12px; background-color: #333; font-family: consolas, courier; word-wrap: break-word; color: #fff"&gt;
  &lt;pre&gt;&lt;span style="color: #2b91af"&gt;  1:&lt;/span&gt;  dates.Zip(dates.Skip(1), (d1, d2) =&amp;gt; d2 - d1);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;As you might expect, the result will be: { 1 day, 3 days }&lt;/p&gt; &lt;img src="http://geekswithblogs.net/nabuk/aggbug/151131.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jakub Niemyjski</dc:creator>
            <guid>http://geekswithblogs.net/nabuk/archive/2012/10/30/linqrsquos-zip-for-adjacent-items.aspx</guid>
            <pubDate>Tue, 30 Oct 2012 20:52:05 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/nabuk/comments/151131.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/nabuk/archive/2012/10/30/linqrsquos-zip-for-adjacent-items.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/nabuk/comments/commentRss/151131.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Generic IAsyncResult</title>
            <category>C#</category>
            <category>asynchronous</category>
            <link>http://geekswithblogs.net/nabuk/archive/2012/10/30/generic-iasyncresult.aspx</link>
            <description>&lt;p&gt;Originally posted on: &lt;a href='http://geekswithblogs.net/nabuk/archive/2012/10/30/generic-iasyncresult.aspx'&gt;http://geekswithblogs.net/nabuk/archive/2012/10/30/generic-iasyncresult.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Today I faced following problem:&lt;/p&gt;  &lt;p&gt;User picks many files by OpenFileDialog control. They must be loaded asynchronously. Loading some of them may fail. I want to receive callback when loading completes. How can I encapsulate all of this in single repository Load method signature ?&lt;/p&gt;  &lt;p&gt;After some time I came up with following interface:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;
&lt;div style="color: #fff; line-height:12px; font-family: Consolas, Courier; background-color: #333; white-space: pre-wrap,-moz-pre-wrap !important,-pre-wrap,-o-pre-wrap; word-wrap: break-word;"&gt;
&lt;pre&gt;&lt;span style="color: #2B91AF;"&gt;  1:&lt;/span&gt;      &lt;span style="color: #00aaff;"&gt;interface&lt;/span&gt; IAsyncResult&amp;lt;&lt;span style="color: #00aaff;"&gt;out&lt;/span&gt; T&amp;gt;
&lt;span style="color: #2B91AF;"&gt;  2:&lt;/span&gt;      {
&lt;span style="color: #2B91AF;"&gt;  3:&lt;/span&gt;          T Result { get; }
&lt;span style="color: #2B91AF;"&gt;  4:&lt;/span&gt;          Exception Error { get; }
&lt;span style="color: #2B91AF;"&gt;  5:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;bool&lt;/span&gt; IsCompleted { get; }
&lt;span style="color: #2B91AF;"&gt;  6:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;bool&lt;/span&gt; Wait(&lt;span style="color: #00aaff;"&gt;int&lt;/span&gt; timeout);
&lt;span style="color: #2B91AF;"&gt;  7:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;void&lt;/span&gt; AttachCallback(Action&amp;lt;IAsyncResult&amp;lt;T&amp;gt;&amp;gt; callback);
&lt;span style="color: #2B91AF;"&gt;  8:&lt;/span&gt;      }
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Similarity to .NET's IAsyncResult is intentional, although my version is generic and simplified. 
  &lt;br /&gt;Instead of supporting AsyncWaitHandle I expose only Wait method.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;


&lt;p&gt;&lt;b&gt;Example&lt;/b&gt;&lt;/p&gt;


&lt;p&gt;Having IAsyncResult&amp;lt;T&amp;gt; we can define Image repository like this:&lt;/p&gt;

&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;
&lt;div style="color: #fff; line-height:12px; font-family: Consolas, Courier; background-color: #333; white-space: pre-wrap,-moz-pre-wrap !important,-pre-wrap,-o-pre-wrap; word-wrap: break-word;"&gt;
&lt;pre&gt;&lt;span style="color: #2B91AF;"&gt;  1:&lt;/span&gt;      &lt;span style="color: #00aaff;"&gt;interface&lt;/span&gt; IImageRepository
&lt;span style="color: #2B91AF;"&gt;  2:&lt;/span&gt;      {
&lt;span style="color: #2B91AF;"&gt;  3:&lt;/span&gt;          IEnumerable&amp;lt;IAsyncResult&amp;lt;Image&amp;gt;&amp;gt; LoadImages();
&lt;span style="color: #2B91AF;"&gt;  4:&lt;/span&gt;      }
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;b&gt;Implementation&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Following implementation wraps synchronous job to IAsyncResult&amp;lt;T&amp;gt; job. 
  &lt;br /&gt;ConcurrentBag was use to synchronize callbacks. Callbacks are stored as weak references to avoid memory leaks.&lt;/p&gt;


&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;
&lt;div style="color: #fff; line-height:12px; font-family: Consolas, Courier; background-color: #333; white-space: pre-wrap,-moz-pre-wrap !important,-pre-wrap,-o-pre-wrap; word-wrap: break-word;"&gt;
&lt;pre&gt;
&lt;span style="color: #2B91AF;"&gt;  1:&lt;/span&gt;      &lt;span style="color: #00aaff;"&gt;public&lt;/span&gt; &lt;span style="color: #00aaff;"&gt;class&lt;/span&gt; JobResult&amp;lt;T&amp;gt;
&lt;span style="color: #2B91AF;"&gt;  2:&lt;/span&gt;      {
&lt;span style="color: #2B91AF;"&gt;  3:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;public&lt;/span&gt; T Result { get; set; }
&lt;span style="color: #2B91AF;"&gt;  4:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;public&lt;/span&gt; Exception Error { get; set; }
&lt;span style="color: #2B91AF;"&gt;  5:&lt;/span&gt;      }
&lt;span style="color: #2B91AF;"&gt;  6:&lt;/span&gt;  
&lt;span style="color: #2B91AF;"&gt;  7:&lt;/span&gt;      &lt;span style="color: #00aaff;"&gt;public&lt;/span&gt; &lt;span style="color: #00aaff;"&gt;class&lt;/span&gt; AsyncResultFromSyncJob&amp;lt;T&amp;gt; : IAsyncResult&amp;lt;T&amp;gt;, IDisposable
&lt;span style="color: #2B91AF;"&gt;  8:&lt;/span&gt;      {
&lt;span style="color: #2B91AF;"&gt;  9:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;private&lt;/span&gt; Func&amp;lt;JobResult&amp;lt;T&amp;gt;&amp;gt; synchronousJob;
&lt;span style="color: #2B91AF;"&gt; 10:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;private&lt;/span&gt; &lt;span style="color: #00aaff;"&gt;readonly&lt;/span&gt; ManualResetEvent completedEvent =
&lt;span style="color: #2B91AF;"&gt; 11:&lt;/span&gt;                  &lt;span style="color: #00aaff;"&gt;new&lt;/span&gt; ManualResetEvent(&lt;span style="color: #00aaff;"&gt;false&lt;/span&gt;);
&lt;span style="color: #2B91AF;"&gt; 12:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;private&lt;/span&gt; &lt;span style="color: #00aaff;"&gt;readonly&lt;/span&gt; ConcurrentBag&amp;lt;WeakReference&amp;gt; completionCallbacks =
&lt;span style="color: #2B91AF;"&gt; 13:&lt;/span&gt;                  &lt;span style="color: #00aaff;"&gt;new&lt;/span&gt; ConcurrentBag&amp;lt;WeakReference&amp;gt;();
&lt;span style="color: #2B91AF;"&gt; 14:&lt;/span&gt;  
&lt;span style="color: #2B91AF;"&gt; 15:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;private&lt;/span&gt; &lt;span style="color: #00aaff;"&gt;void&lt;/span&gt; OnCompletion(IAsyncResult ar)
&lt;span style="color: #2B91AF;"&gt; 16:&lt;/span&gt;          {
&lt;span style="color: #2B91AF;"&gt; 17:&lt;/span&gt;              &lt;span style="color: #00aaff;"&gt;var&lt;/span&gt; jobResult = synchronousJob.EndInvoke(ar);
&lt;span style="color: #2B91AF;"&gt; 18:&lt;/span&gt;              &lt;span style="color: #00aaff;"&gt;this&lt;/span&gt;.Result = jobResult.Result;
&lt;span style="color: #2B91AF;"&gt; 19:&lt;/span&gt;              &lt;span style="color: #00aaff;"&gt;this&lt;/span&gt;.Error = jobResult.Error;
&lt;span style="color: #2B91AF;"&gt; 20:&lt;/span&gt;              &lt;span style="color: #00aaff;"&gt;this&lt;/span&gt;.completedEvent.Set();
&lt;span style="color: #2B91AF;"&gt; 21:&lt;/span&gt;  
&lt;span style="color: #2B91AF;"&gt; 22:&lt;/span&gt;              synchronousJob = &lt;span style="color: #00aaff;"&gt;null&lt;/span&gt;;
&lt;span style="color: #2B91AF;"&gt; 23:&lt;/span&gt;  
&lt;span style="color: #2B91AF;"&gt; 24:&lt;/span&gt;              FireCallbacks();
&lt;span style="color: #2B91AF;"&gt; 25:&lt;/span&gt;          }
&lt;span style="color: #2B91AF;"&gt; 26:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;private&lt;/span&gt; &lt;span style="color: #00aaff;"&gt;void&lt;/span&gt; FireCallbacks()
&lt;span style="color: #2B91AF;"&gt; 27:&lt;/span&gt;          {
&lt;span style="color: #2B91AF;"&gt; 28:&lt;/span&gt;              WeakReference wr;
&lt;span style="color: #2B91AF;"&gt; 29:&lt;/span&gt;              Action&amp;lt;IAsyncResult&amp;lt;T&amp;gt;&amp;gt; callback;
&lt;span style="color: #2B91AF;"&gt; 30:&lt;/span&gt;  
&lt;span style="color: #2B91AF;"&gt; 31:&lt;/span&gt;              &lt;span style="color: #00aaff;"&gt;while&lt;/span&gt; (completionCallbacks.TryTake(&lt;span style="color: #00aaff;"&gt;out&lt;/span&gt; wr))
&lt;span style="color: #2B91AF;"&gt; 32:&lt;/span&gt;                  &lt;span style="color: #00aaff;"&gt;if&lt;/span&gt; ((callback = wr.Target &lt;span style="color: #00aaff;"&gt;as&lt;/span&gt; Action&amp;lt;IAsyncResult&amp;lt;T&amp;gt;&amp;gt;) != &lt;span style="color: #00aaff;"&gt;null&lt;/span&gt;)
&lt;span style="color: #2B91AF;"&gt; 33:&lt;/span&gt;                      Task.Factory.StartNew(() =&amp;gt; callback(&lt;span style="color: #00aaff;"&gt;this&lt;/span&gt;));
&lt;span style="color: #2B91AF;"&gt; 34:&lt;/span&gt;          }
&lt;span style="color: #2B91AF;"&gt; 35:&lt;/span&gt;  
&lt;span style="color: #2B91AF;"&gt; 36:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;public&lt;/span&gt; AsyncResultFromSyncJob(Func&amp;lt;JobResult&amp;lt;T&amp;gt;&amp;gt; synchronousJob)
&lt;span style="color: #2B91AF;"&gt; 37:&lt;/span&gt;          {
&lt;span style="color: #2B91AF;"&gt; 38:&lt;/span&gt;              &lt;span style="color: #00aaff;"&gt;this&lt;/span&gt;.synchronousJob = synchronousJob;
&lt;span style="color: #2B91AF;"&gt; 39:&lt;/span&gt;              synchronousJob.BeginInvoke(OnCompletion, &lt;span style="color: #00aaff;"&gt;null&lt;/span&gt;);
&lt;span style="color: #2B91AF;"&gt; 40:&lt;/span&gt;          }
&lt;span style="color: #2B91AF;"&gt; 41:&lt;/span&gt;  &lt;span style="color: #f00;"&gt;
&lt;span style="color: #2B91AF;"&gt; 42:&lt;/span&gt;          #region IAsyncResult&amp;lt;T&amp;gt;
&lt;span style="color: #2B91AF;"&gt; 43:&lt;/span&gt;  &lt;/span&gt;
&lt;span style="color: #2B91AF;"&gt; 44:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;public&lt;/span&gt; T Result { get; &lt;span style="color: #00aaff;"&gt;private&lt;/span&gt; set; }
&lt;span style="color: #2B91AF;"&gt; 45:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;public&lt;/span&gt; Exception Error { get; &lt;span style="color: #00aaff;"&gt;private&lt;/span&gt; set; }
&lt;span style="color: #2B91AF;"&gt; 46:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;public&lt;/span&gt; &lt;span style="color: #00aaff;"&gt;bool&lt;/span&gt; IsCompleted { get { &lt;span style="color: #00aaff;"&gt;return&lt;/span&gt; &lt;span style="color: #00aaff;"&gt;this&lt;/span&gt;.completedEvent.WaitOne(0); } }
&lt;span style="color: #2B91AF;"&gt; 47:&lt;/span&gt;  
&lt;span style="color: #2B91AF;"&gt; 48:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;public&lt;/span&gt; &lt;span style="color: #00aaff;"&gt;bool&lt;/span&gt; Wait(&lt;span style="color: #00aaff;"&gt;int&lt;/span&gt; timeout = Timeout.Infinite)
&lt;span style="color: #2B91AF;"&gt; 49:&lt;/span&gt;          {
&lt;span style="color: #2B91AF;"&gt; 50:&lt;/span&gt;              &lt;span style="color: #00aaff;"&gt;return&lt;/span&gt; completedEvent.WaitOne(timeout);
&lt;span style="color: #2B91AF;"&gt; 51:&lt;/span&gt;          }
&lt;span style="color: #2B91AF;"&gt; 52:&lt;/span&gt;  
&lt;span style="color: #2B91AF;"&gt; 53:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;public&lt;/span&gt; &lt;span style="color: #00aaff;"&gt;void&lt;/span&gt; AttachCallback(Action&amp;lt;IAsyncResult&amp;lt;T&amp;gt;&amp;gt; callback)
&lt;span style="color: #2B91AF;"&gt; 54:&lt;/span&gt;          {
&lt;span style="color: #2B91AF;"&gt; 55:&lt;/span&gt;              completionCallbacks.Add(&lt;span style="color: #00aaff;"&gt;new&lt;/span&gt; WeakReference(callback));
&lt;span style="color: #2B91AF;"&gt; 56:&lt;/span&gt;              
&lt;span style="color: #2B91AF;"&gt; 57:&lt;/span&gt;              &lt;span style="color: #00aaff;"&gt;if&lt;/span&gt;(IsCompleted)
&lt;span style="color: #2B91AF;"&gt; 58:&lt;/span&gt;                  FireCallbacks();
&lt;span style="color: #2B91AF;"&gt; 59:&lt;/span&gt;          }
&lt;span style="color: #2B91AF;"&gt; 60:&lt;/span&gt;  &lt;span style="color: #f00;"&gt;
&lt;span style="color: #2B91AF;"&gt; 61:&lt;/span&gt;          #endregion
&lt;span style="color: #2B91AF;"&gt; 62:&lt;/span&gt;  &lt;/span&gt;&lt;span style="color: #f00;"&gt;
&lt;span style="color: #2B91AF;"&gt; 63:&lt;/span&gt;          #region IDisposable
&lt;span style="color: #2B91AF;"&gt; 64:&lt;/span&gt;  &lt;/span&gt;
&lt;span style="color: #2B91AF;"&gt; 65:&lt;/span&gt;          &lt;span style="color: #00aaff;"&gt;public&lt;/span&gt; &lt;span style="color: #00aaff;"&gt;void&lt;/span&gt; Dispose()
&lt;span style="color: #2B91AF;"&gt; 66:&lt;/span&gt;          {
&lt;span style="color: #2B91AF;"&gt; 67:&lt;/span&gt;              completedEvent.Dispose();
&lt;span style="color: #2B91AF;"&gt; 68:&lt;/span&gt;          }
&lt;span style="color: #2B91AF;"&gt; 69:&lt;/span&gt;  &lt;span style="color: #f00;"&gt;
&lt;span style="color: #2B91AF;"&gt; 70:&lt;/span&gt;          #endregion
&lt;span style="color: #2B91AF;"&gt; 71:&lt;/span&gt;  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;I found Mark Seemann's IAsyncResult generic implementation after writing my own: 
  &lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/ploeh/archive/2007/02/09/agenericiasyncresultimplementation.aspx"&gt;http://blogs.msdn.com/b/ploeh/archive/2007/02/09/agenericiasyncresultimplementation.aspx&lt;/a&gt;&lt;/p&gt; &lt;img src="http://geekswithblogs.net/nabuk/aggbug/151130.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jakub Niemyjski</dc:creator>
            <guid>http://geekswithblogs.net/nabuk/archive/2012/10/30/generic-iasyncresult.aspx</guid>
            <pubDate>Tue, 30 Oct 2012 18:24:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/nabuk/comments/151130.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/nabuk/archive/2012/10/30/generic-iasyncresult.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/nabuk/comments/commentRss/151130.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>