<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Yevhen Bobrov]]></title>
  <link href="http://blog.xtalion.com/atom.xml" rel="self"/>
  <link href="http://blog.xtalion.com/"/>
  <updated>2014-08-22T00:22:11+03:00</updated>
  <id>http://blog.xtalion.com/</id>
  <author>
    <name><![CDATA[Yevhen Bobrov]]></name>
    <email><![CDATA[yevhen.bobrov@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Frictionless WCF and Silverlight - Now for Unit Testing]]></title>
    <link href="http://blog.xtalion.com/2011/05/23/frictionless-wcf-silverlight-unit-testing/"/>
    <updated>2011-05-23T00:15:00+03:00</updated>
    <id>http://blog.xtalion.com/2011/05/23/frictionless-wcf-silverlight-unit-testing</id>
    <content type="html"><![CDATA[<p>I decided to split material on this subject and so will be publishing it in 2 parts. To not overload an articles and to finally throw something out of the door (I was having difficulties with spare time and motivation). So the first one will be for transparent asynchrony and dual mode execution and the second one will touch on advanced topics.</p>

<p>The first part is already on <a href="http://www.codeproject.com/Articles/200085/Frictionless-WCF-service-consumption-in-Silverligh">CodeProject</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Papa Was a Rollin' Stone]]></title>
    <link href="http://blog.xtalion.com/2010/11/04/papa-was-rollin-stone/"/>
    <updated>2010-11-04T00:15:00+02:00</updated>
    <id>http://blog.xtalion.com/2010/11/04/papa-was-rollin-stone</id>
    <content type="html"><![CDATA[<p>I don&rsquo;t know for sure if it was a joke or not, but while investigating the source code of John Papa&rsquo;s recent Silverlight PDC demo, I&rsquo;ve found some really funny (and weird :) stuff. Just take a look.</p>

<!-- more -->




<figure class='code'> <div class="highlight"><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">Core</span><br /></span><span class='line'><span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">const</span> <span class="kt">string</span> <span class="n">StateKeyParameter</span> <span class="p">=</span> <span class="s">&quot;statekey&quot;</span><span class="p">;</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">static</span> <span class="kt">string</span> <span class="nf">NewKey</span><span class="p">()</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">Guid</span><span class="p">.</span><span class="n">NewGuid</span><span class="p">().</span><span class="n">ToString</span><span class="p">().</span><span class="n">RemoveChar</span><span class="p">(</span><span class="sc">&#39;-&#39;</span><span class="p">);</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span><br /></span><span class='line'><span class="p">}</span><br /></span></code></pre></div></figure>


<p>Hmmm, this can be done more optimally. There is no need to remove hyphens from canonical string representation of <code>Guid</code>. The <code>ToString()</code> method accepts standard format specifier and according to MSDN one may just specify &ldquo;N&rdquo; in order to get <code>Guid</code> representation in the form of &ldquo;00000000000000000000000000000000&rdquo;.</p>

<p>But the actual fun started once I&rsquo;ve recognized, that I can&rsquo;t recall I&rsquo;ve ever seen <code>RemoveChar</code> method before. The <code>String</code> class have no such method. The <code>RemoveChar</code> is an extension method defined as follows:</p>

<figure class='code'> <div class="highlight"><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">StringExtensions</span><br /></span><span class='line'><span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">static</span> <span class="kt">string</span> <span class="nf">RemoveChar</span><span class="p">(</span><span class="k">this</span> <span class="kt">string</span> <span class="n">text</span><span class="p">,</span> <span class="kt">char</span> <span class="n">character</span><span class="p">)</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">string</span><span class="p">[]</span> <span class="n">parts</span> <span class="p">=</span> <span class="n">text</span><span class="p">.</span><span class="n">Split</span><span class="p">(</span><span class="n">character</span><span class="p">);</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">sb</span> <span class="p">=</span> <span class="k">new</span> <span class="n">StringBuilder</span><span class="p">();</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">part</span> <span class="k">in</span> <span class="n">parts</span><span class="p">)</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">sb</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="n">part</span><span class="p">);</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">sb</span><span class="p">.</span><span class="n">ToString</span><span class="p">();</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span><br /></span><span class='line'><span class="p">}</span><br /></span></code></pre></div></figure>


<p>:) hehe, funny, no?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Frictionless asynchrony in .NET with Coroutines]]></title>
    <link href="http://blog.xtalion.com/2010/09/28/frictionless-asynchrony-in-net-with/"/>
    <updated>2010-09-28T00:15:00+03:00</updated>
    <id>http://blog.xtalion.com/2010/09/28/frictionless-asynchrony-in-net-with</id>
    <content type="html"><![CDATA[<p>In my last article I&rsquo;ve mentioned that the approach to asynchronous programming presented in the article could be used in any other non-Silverlight contexts. Since that time I&rsquo;ve did a lot of small improvements to the codebase and introduced some new classes to support other common use-cases.</p>

<!-- more -->


<h2>What&rsquo;s new</h2>

<ul>
<li>Added ability to asynchronously invoke any synchronous operation</li>
<li>Added ability to transparently invoke APM version of synchronous method</li>
<li>Switched dispatching to use common synchronization context</li>
</ul>


<p>I&rsquo;ve also included two sample applications: one is Windows Forms and another is Silverlight. In Windows Forms application I have sample code which demonstrates asynchronous polling and background downloading of web page. The former shows how to transparently call normal synchronous method asynchronously and the latter shows how to turn any non-standard (non-APM, EAP or proprietary) asynchronous operation to be compatible with the Coroutines infrastructure.</p>

<h2>Asynchronous execution of synchronous methods</h2>

<p>The sample application shows the scrolling ticker with the latest news from the Reuters feed. The class which fetches news is very simple (thanks to Linq to Xml):</p>

<figure class='code'> <div class="highlight"><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">NewsFeed</span><br /></span><span class='line'><span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="kt">string</span> <span class="nf">Download</span><span class="p">(</span><span class="kt">int</span> <span class="n">top</span><span class="p">)</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">string</span> <span class="n">timestamp</span> <span class="p">=</span> <span class="n">DateTime</span><span class="p">.</span><span class="n">Now</span><span class="p">.</span><span class="n">ToString</span><span class="p">(</span><span class="s">&quot;HH:mm:ss&quot;</span><span class="p">);</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">XElement</span> <span class="n">rss</span> <span class="p">=</span> <span class="n">XElement</span><span class="p">.</span><span class="n">Load</span><span class="p">(</span><span class="s">&quot;http://mobile.reuters.com/reuters/rss/TOP.xml&quot;</span><span class="p">);</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">XElement</span><span class="p">&gt;</span> <span class="n">titles</span> <span class="p">=</span> <span class="n">rss</span><span class="p">.</span><span class="n">Descendants</span><span class="p">(</span><span class="s">&quot;item&quot;</span><span class="p">).</span><span class="n">Descendants</span><span class="p">(</span><span class="s">&quot;title&quot;</span><span class="p">);</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">timestamp</span> <span class="p">+</span> <span class="s">&quot;:   &quot;</span> <span class="p">+</span>  <span class="kt">string</span><span class="p">.</span><span class="n">Join</span><span class="p">(</span><span class="s">&quot;      &quot;</span><span class="p">,</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">titles</span><span class="p">.</span><span class="n">Take</span><span class="p">(</span><span class="n">top</span><span class="p">).</span><span class="n">Select</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="p">(</span><span class="kt">string</span><span class="p">)</span><span class="n">x</span><span class="p">).</span><span class="n">ToArray</span><span class="p">());</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;<span class="p">}</span><br /></span><span class='line'><span class="p">}</span><br /></span></code></pre></div></figure>


<p>Here, we have normal synchronous method and we need to invoke it asynchronously. AsyncCommand / AsyncQuery<TResult> pair of classes is your friend in this situation.</p>

<figure class='code'> <div class="highlight"><pre><code class='csharp'><span class='line'><span class="k">readonly</span> <span class="n">NewsFeed</span> <span class="n">news</span> <span class="p">=</span> <span class="k">new</span> <span class="n">NewsFeed</span><span class="p">();</span><br /></span><span class='line'><br /></span><span class='line'><span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">IAction</span><span class="p">&gt;</span> <span class="n">UpdateNews</span><span class="p">()</span><br /></span><span class='line'><span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">while</span> <span class="p">(</span><span class="k">true</span><span class="p">)</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">query</span> <span class="p">=</span> <span class="k">new</span> <span class="n">AsyncQuery</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;(()</span> <span class="p">=&gt;</span> <span class="n">news</span><span class="p">.</span><span class="n">Download</span><span class="p">(</span><span class="m">5</span><span class="p">));</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">yield</span> <span class="k">return</span> <span class="n">query</span><span class="p">;</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="p">(!</span><span class="n">query</span><span class="p">.</span><span class="n">Failed</span><span class="p">)</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">ticker</span><span class="p">.</span><span class="n">ScrollText</span> <span class="p">=</span> <span class="n">query</span><span class="p">.</span><span class="n">Result</span><span class="p">;</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">yield</span> <span class="k">return</span> <span class="n">Sleep</span><span class="p">.</span><span class="n">Timeout</span><span class="p">(</span><span class="n">TimeSpan</span><span class="p">.</span><span class="n">FromSeconds</span><span class="p">(</span><span class="m">120</span><span class="p">));</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span><br /></span><span class='line'><span class="p">}</span><br /></span></code></pre></div></figure>


<p>Internally, ThreadPool&rsquo;s <code>QueueUserWorkItem()</code> method is used for asynchronous execution of synchronous calls.</p>

<h2>Transparent invocation of APM method pair</h2>

<p>In many places in .NET framework, in addition to synchronous methods, APIs do provide their APM counterpart (<code>BeginXXX\EndXX</code> method pair). In most cases (that I&rsquo;ve inspected) they are nothing more than just an asynchronous invocation of the very same synchronous method. In such cases you can safely ignore them and just use <code>AsyncCommand / AsyncQuery&lt;TResult&gt;</code> classes to asynchronously invoke synchronous methods. But there some (very) rare cases when APM method pair may provide some internal optimizations. For such cases, for invocation you still specify the synchronous method but the APM method pair will be used instead.</p>

<figure class='code'> <div class="highlight"><pre><code class='csharp'><span class='line'><span class="kt">var</span> <span class="n">command</span> <span class="p">=</span> <span class="k">new</span> <span class="n">AsyncCommand</span><span class="p">(()</span> <span class="p">=&gt;</span> <span class="n">instance</span><span class="p">.</span><span class="n">Method</span><span class="p">(</span><span class="n">parameter</span><span class="p">),</span> <span class="n">apm</span><span class="p">:</span> <span class="k">true</span><span class="p">);</span><br /></span></code></pre></div></figure>


<p>Sometimes, all you have is only the APM method pair. As an example see <code>System.Net.WebRequest</code>. This class provides only <code>BeginGetResponse\EndGetResponse</code> APM methods but no GetResponse synchronous method. Support for such scenarios is coming. It will be something similar to <code>Observable.FromAsyncPattern</code> from Reactive Extensions.</p>

<h2>Custom asynchronous patterns</h2>

<p>You can make any other non-standard (non-APM) or proprietary asynchronous API to be compatible with the Coroutines infrastructure provided by Servelat Pieces. For this you&rsquo;ll need to use <code>CustomAsyncCommand / CustomAsyncQuery&lt;TResult&gt;</code> classes and you&rsquo;ll also need to implement a custom <code>AsyncCallConductor</code>. Call conductor is mediator that has a known interface, recognized by the Coroutines infrastructure.</p>

<p>Let&rsquo;s see how we could turn EAP-based model to be compliant with our infrastructure. As an example I&rsquo;ll use <code>System.Net.WebClient</code> class. The WebClient&rsquo;s API so far:</p>

<figure class='code'> <div class="highlight"><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">WebClient</span> <span class="p">:</span> <span class="n">Component</span><br /></span><span class='line'><span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">DownloadStringAsync</span><span class="p">(</span><span class="n">Uri</span> <span class="n">address</span><span class="p">);</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">DownloadFileAsync</span><span class="p">(</span><span class="n">Uri</span> <span class="n">address</span><span class="p">,</span> <span class="kt">string</span> <span class="n">fileName</span><span class="p">);</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">event</span> <span class="n">DownloadStringCompletedEventHandler</span> <span class="n">DownloadStringCompleted</span><span class="p">;</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">event</span> <span class="n">AsyncCompletedEventHandler</span> <span class="n">DownloadFileCompleted</span><span class="p">;</span><br /></span><span class='line'><span class="p">}</span><br /></span></code></pre></div></figure>


<p>Remember, for synchronous WCF service interface in Silverlight we were required to create its asynchronous twin. Here we need an opposite :)</p>

<figure class='code'> <div class="highlight"><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">interface</span> <span class="n">IWebClient</span><br /></span><span class='line'><span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">string</span> <span class="nf">DownloadString</span><span class="p">(</span><span class="n">Uri</span> <span class="n">address</span><span class="p">);</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">void</span> <span class="nf">DownloadFile</span><span class="p">(</span><span class="n">Uri</span> <span class="n">address</span><span class="p">,</span> <span class="kt">string</span> <span class="n">fileName</span><span class="p">);</span><br /></span><span class='line'><span class="p">}</span><br /></span></code></pre></div></figure>


<p>That was the fist step. The next step is to provide a special implementation of this interface derived from <code>AsyncCallConductor</code> class.</p>

<figure class='code'> <div class="highlight"><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">WebClientConductor</span> <span class="p">:</span> <span class="n">AsyncCallConductor</span><span class="p">,</span> <span class="n">IWebClient</span><br /></span><span class='line'><span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">readonly</span> <span class="n">WebClient</span> <span class="n">client</span><span class="p">;</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">WebClientConductor</span><span class="p">(</span><span class="n">WebClient</span> <span class="n">client</span><span class="p">)</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">this</span><span class="p">.</span><span class="n">client</span> <span class="p">=</span> <span class="n">client</span><span class="p">;</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">DownloadFile</span><span class="p">(</span><span class="n">Uri</span> <span class="n">address</span><span class="p">,</span> <span class="kt">string</span> <span class="n">fileName</span><span class="p">)</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span><span class="p">.</span><span class="n">DownloadFileCompleted</span> <span class="p">+=</span> <span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="p">=&gt;</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Exception</span> <span class="p">=</span> <span class="n">e</span><span class="p">.</span><span class="n">Error</span><span class="p">;</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Complete</span><span class="p">();</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">};</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span><span class="p">.</span><span class="n">DownloadFileAsync</span><span class="p">(</span><span class="n">address</span><span class="p">,</span> <span class="n">fileName</span><span class="p">);</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="kt">string</span> <span class="nf">DownloadString</span><span class="p">(</span><span class="n">Uri</span> <span class="n">address</span><span class="p">)</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span><span class="p">.</span><span class="n">DownloadStringCompleted</span> <span class="p">+=</span> <span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="p">=&gt;</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Exception</span> <span class="p">=</span> <span class="n">e</span><span class="p">.</span><span class="n">Error</span><span class="p">;</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Result</span> <span class="p">=</span> <span class="n">e</span><span class="p">.</span><span class="n">Result</span><span class="p">;</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Complete</span><span class="p">();</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">};</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span><span class="p">.</span><span class="n">DownloadStringAsync</span><span class="p">(</span><span class="n">address</span><span class="p">);</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="k">null</span><span class="p">;</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span><br /></span><span class='line'><span class="p">}</span><br /></span></code></pre></div></figure>


<p>In this implementation class every interface operation is converted to the actual call. When the call is completed the implementation should signal about that, set operation result and handle any errors related to the execution. Basically it just conducts an asynchronous operation. Now you can use <code>CustomAsyncQuery</code> which knows how to conduct the call using your <code>AsyncCallConductor</code> implementation.</p>

<figure class='code'> <div class="highlight"><pre><code class='csharp'><span class='line'><span class="k">static</span> <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">IAction</span><span class="p">&gt;</span> <span class="n">BackgroundDownload</span><span class="p">()</span><br /></span><span class='line'><span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">conductor</span> <span class="p">=</span> <span class="k">new</span> <span class="n">WebClientConductor</span><span class="p">(</span><span class="k">new</span> <span class="n">WebClient</span><span class="p">());</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">uri</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Uri</span><span class="p">(</span><span class="s">&quot;http://www.codeproject.com/&quot;</span><span class="p">);</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">query</span> <span class="p">=</span> <span class="k">new</span> <span class="n">CustomAsyncQuery</span><span class="p">&lt;</span><span class="n">WebClientConductor</span><span class="p">,</span> <span class="n">IWebClient</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">(</span><span class="n">conductor</span><span class="p">,</span> <span class="n">client</span> <span class="p">=&gt;</span> <span class="n">client</span><span class="p">.</span><span class="n">DownloadString</span><span class="p">(</span><span class="n">uri</span><span class="p">));</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">yield</span> <span class="k">return</span> <span class="n">query</span><span class="p">;</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">File</span><span class="p">.</span><span class="n">WriteAllText</span><span class="p">(</span><span class="s">@&quot;C:\Temp\1.html&quot;</span><span class="p">,</span> <span class="n">query</span><span class="p">.</span><span class="n">Result</span><span class="p">);</span><br /></span><span class='line'><span class="p">}</span><br /></span></code></pre></div></figure>


<p>Looks like a lot of work. Well, you&rsquo;ll need to implement your custom call conductor only once and than you can reuse it everywhere. For some of the frequently used .NET classes like <code>WebRequest</code> or <code>WebClient</code> I&rsquo;ll possibly provide conductor implementations right in the Servelat Pieces library. And as always we can hide some dirty construction code behind the Builder interface.</p>

<figure class='code'> <div class="highlight"><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">WebClientCallBuilder</span><br /></span><span class='line'><span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">readonly</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">WebClient</span><span class="p">&gt;</span> <span class="n">factory</span><span class="p">;</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">WebClientCallBuilder</span><span class="p">(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">WebClient</span><span class="p">&gt;</span> <span class="n">factory</span><span class="p">)</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">this</span><span class="p">.</span><span class="n">factory</span> <span class="p">=</span> <span class="n">factory</span><span class="p">;</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="n">CustomAsyncCommand</span><span class="p">&lt;</span><span class="n">WebClientConductor</span><span class="p">,</span> <span class="n">IWebClient</span><span class="p">&gt;</span> <span class="n">Command</span><span class="p">(</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Expression</span><span class="p">&lt;</span><span class="n">Action</span><span class="p">&lt;</span><span class="n">IWebClient</span><span class="p">&gt;&gt;</span> <span class="n">expression</span><span class="p">)</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="k">new</span> <span class="n">CustomAsyncCommand</span><span class="p">&lt;</span><span class="n">WebClientConductor</span><span class="p">,</span> <span class="n">IWebClient</span><span class="p">&gt;(</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">new</span> <span class="nf">WebClientConductor</span><span class="p">(</span><span class="n">factory</span><span class="p">()),</span> <span class="n">expression</span><span class="p">);</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="n">CustomAsyncQuery</span><span class="p">&lt;</span><span class="n">WebClientConductor</span><span class="p">,</span> <span class="n">IWebClient</span><span class="p">,</span> <span class="n">TResult</span><span class="p">&gt;</span> <span class="n">Query</span><span class="p">&lt;</span><span class="n">TResult</span><span class="p">&gt;(</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Expression</span><span class="p">&lt;</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">IWebClient</span><span class="p">,</span> <span class="n">TResult</span><span class="p">&gt;&gt;</span> <span class="n">expression</span><span class="p">)</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="k">new</span> <span class="n">CustomAsyncQuery</span><span class="p">&lt;</span><span class="n">WebClientConductor</span><span class="p">,</span> <span class="n">IWebClient</span><span class="p">,</span> <span class="n">TResult</span><span class="p">&gt;(</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">new</span> <span class="nf">WebClientConductor</span><span class="p">(</span><span class="n">factory</span><span class="p">()),</span> <span class="n">expression</span><span class="p">);</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span><br /></span><span class='line'><span class="p">}</span><br /></span></code></pre></div></figure>


<p>This will simplify client code down to this:</p>

<figure class='code'> <div class="highlight"><pre><code class='csharp'><span class='line'><span class="k">static</span> <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">IAction</span><span class="p">&gt;</span> <span class="n">BackgroundDownload</span><span class="p">()</span><br /></span><span class='line'><span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">build</span> <span class="p">=</span> <span class="k">new</span> <span class="n">WebClientCallBuilder</span><span class="p">(()</span> <span class="p">=&gt;</span> <span class="k">new</span> <span class="n">WebClient</span><span class="p">());</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">uri</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Uri</span><span class="p">(</span><span class="s">&quot;http://www.codeproject.com/&quot;</span><span class="p">);</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">query</span> <span class="p">=</span> <span class="n">build</span><span class="p">.</span><span class="n">Query</span><span class="p">(</span><span class="n">client</span> <span class="p">=&gt;</span> <span class="n">client</span><span class="p">.</span><span class="n">DownloadString</span><span class="p">(</span><span class="n">uri</span><span class="p">));</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">cmd</span> <span class="p">=</span> <span class="n">build</span><span class="p">.</span><span class="n">Command</span><span class="p">(</span><span class="n">client</span> <span class="p">=&gt;</span> <span class="n">client</span><span class="p">.</span><span class="n">DownloadFile</span><span class="p">(</span><span class="n">uri</span><span class="p">,</span> <span class="s">@&quot;C:\Temp\2.html&quot;</span><span class="p">));</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">yield</span> <span class="k">return</span> <span class="n">Parallel</span><span class="p">.</span><span class="n">Actions</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">cmd</span><span class="p">);</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="p">(!</span><span class="n">query</span><span class="p">.</span><span class="n">Failed</span><span class="p">)</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">File</span><span class="p">.</span><span class="n">WriteAllText</span><span class="p">(</span><span class="s">@&quot;C:\Temp\1.html&quot;</span><span class="p">,</span> <span class="n">query</span><span class="p">.</span><span class="n">Result</span><span class="p">);</span><br /></span><span class='line'><span class="p">}</span><br /></span></code></pre></div></figure>


<h2>Common synchronization context</h2>

<p>Previously dispatching of call completion was done through the special Dispatcher class and it was required to implement specific dispatcher for each environment (WinForms, Silverlight, ASP.NET etc). But thanks to the recent Jeffrey Richter&rsquo;s article it is not required anymore. The Coroutines infrastructure provided by Servelat Pieces project should now correctly work in any environment.</p>

<p>According to Jeffrey:</p>

<blockquote><p>For GUI applications such as Windows Forms, Windows Presentation Foundation, and Silverlight, the threading model dictates that all UI components must be updated by the thread that created them. So, when a GUI thread calls SynchronizationContext.Current, a reference to an object that knows how to invoke the delegate on the calling GUI thread is returned.</p>

<p>For ASP.NET applications, calling SynchronizationContext.Current returns a reference to an object that knows how to associates the original client request&rsquo;s identity and culture with the calling thread before invoking the delegate.</p>

<p>Console and NT service applications have no threading model and therefore do not require synchronization.</p></blockquote>

<p>All async actions which require dispatching inherits from the base <code>DispatchAction</code> class. As every action is (should be) created on the main thread I simply grab the synchronization context on initialization and then use it to synchronize call completion.</p>

<figure class='code'> <div class="highlight"><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">abstract</span> <span class="k">class</span> <span class="nc">DispatchAction</span> <span class="p">:</span> <span class="n">IAction</span><br /></span><span class='line'><span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">event</span> <span class="n">EventHandler</span> <span class="n">Completed</span><span class="p">;</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">readonly</span> <span class="n">SynchronizationContext</span> <span class="n">dispatcher</span> <span class="p">=</span> <span class="n">SynchronizationContext</span><span class="p">.</span><span class="n">Current</span><span class="p">;</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">protected</span> <span class="k">internal</span> <span class="k">void</span> <span class="nf">SignalCompleted</span><span class="p">()</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">EventHandler</span> <span class="n">handler</span> <span class="p">=</span> <span class="n">Completed</span><span class="p">;</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="p">(</span><span class="n">handler</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span><span class="p">;</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="p">(</span><span class="n">dispatcher</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">handler</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="n">EventArgs</span><span class="p">.</span><span class="n">Empty</span><span class="p">);</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span><span class="p">;</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">dispatcher</span><span class="p">.</span><span class="n">Post</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">handler</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="n">EventArgs</span><span class="p">.</span><span class="n">Empty</span><span class="p">),</span> <span class="k">null</span><span class="p">);</span><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span><br /></span><span class='line'><br /></span><span class='line'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">abstract</span> <span class="k">void</span> <span class="nf">Execute</span><span class="p">();</span><br /></span><span class='line'><span class="p">}</span><br /></span></code></pre></div></figure>


<p>That were all news for today. I&rsquo;m currently busy working on the third article in the series which is about unit testing of asynchronous code (and how Coroutines and transparent asynchrony changes the game) and hope to publish it next week. I would love to hear feedback from you on Servelat Pieces project. So if you have something to say, you&rsquo;re welcome. In particular I&rsquo;d love to hear what do you think about its usefulness, applicability to the real-world problems, usability, whether it sucks or not and so on. Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Frictionless WCF service consumption in Silverlight]]></title>
    <link href="http://blog.xtalion.com/2010/09/18/frictionless-wcf-service-consumption-in-silverlight/"/>
    <updated>2010-09-18T00:15:00+03:00</updated>
    <id>http://blog.xtalion.com/2010/09/18/frictionless-wcf-service-consumption-in-silverlight</id>
    <content type="html"><![CDATA[<p>I&rsquo;m writing series of articles on the subject. I&rsquo;ll be publishing them on CodeProject and will post any additional materials on the blog. The contents so far:</p>

<ul>
<li><a href="http://www.codeproject.com/Articles/101023/Frictionless-WCF-Service-Consumption-in-Silverligh">Part 1</a>. Consuming WCF services in Silverlight without static code generation of service proxy</li>
<li><a href="http://www.codeproject.com/Articles/110888/Frictionless-WCF-service-consumption-in-Silverligh">Part 2</a>. Fixing &ldquo;all is async&rdquo; problem</li>
<li><a href="http://www.codeproject.com/Articles/200085/Frictionless-WCF-service-consumption-in-Silverligh">Part 3</a>. Benefits of transparent asynchrony in respect to unit testing</li>
</ul>

]]></content>
  </entry>
  
</feed>
