<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-712077106443942647</id><updated>2011-12-23T06:08:39.735-08:00</updated><category term='Rx'/><category term='WF'/><category term='Reflection'/><category term='LinqToXml'/><category term='Linq'/><category term='C#3.0'/><category term='Presentation'/><category term='WP7'/><category term='TPL'/><category term='RxSandbox'/><category term='F#'/><category term='T4'/><category term='ExpressionTrees'/><category term='Puzzle'/><category term='WPF'/><category term='XNA'/><category term='Caliburn.Micro'/><category term='WF4'/><category term='Silverlight'/><category term='AsyncCTP'/><title type='text'>have fun</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-6516545703803421103</id><published>2011-12-23T06:08:00.001-08:00</published><updated>2011-12-23T06:08:39.740-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ExpressionTrees'/><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><category scheme='http://www.blogger.com/atom/ns#' term='C#3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='LinqToXml'/><title type='text'>LINQ presentation</title><content type='html'>&lt;p&gt;Today I gave my old (from 2009) presentation about the LINQ. The video can be found &lt;a href="http://vimeo.com/34125399"&gt;here&lt;/a&gt;, slides and all code samples presented during this talk can be downloaded from &lt;a href="http://archive.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=15857"&gt;here&lt;/a&gt;. I hope you find it useful.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-6516545703803421103?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/6516545703803421103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=6516545703803421103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/6516545703803421103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/6516545703803421103'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2011/12/linq-presentation.html' title='LINQ presentation'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-1845868155185680813</id><published>2011-09-20T02:14:00.001-07:00</published><updated>2011-09-20T02:14:39.271-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><title type='text'>When the Reactive Framework meets F# 3.0</title><content type='html'>&lt;p&gt;Few days ago I have been writing about &lt;a href="http://mnajder.blogspot.com/2011/09/programming-with-c-asynchronous.html"&gt;asynchronous sequences&lt;/a&gt; in C#. This time we will see how easy it is to implement the same web crawler using Reactive Framework and a new F# 3.0 feature called &lt;a href="http://msdn.microsoft.com/en-us/library/hh225374%28v=vs.110%29.aspx"&gt;Query Expressions&lt;/a&gt;. The original implementation of web crawler created by Tomas Petricek can be found &lt;a href="http://www.fssnip.net/7f"&gt;here&lt;/a&gt; and my implementation is surprisingly similar:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;let rec randomCrawl url = &lt;br /&gt;  let visited = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.Collections.Generic.HashSet&amp;lt;_&amp;gt;()&lt;br /&gt;  &lt;br /&gt;  let rec loop url = obs {&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; visited.Add(url) then&lt;br /&gt;      let! doc = (downloadDocument url) |&amp;gt; fromAsync&lt;br /&gt;      match doc with &lt;br /&gt;      | Some doc -&amp;gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;yield&lt;/span&gt; url, getTitle doc&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; link &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; extractLinks doc &lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;yield&lt;/span&gt;! loop link &lt;br /&gt;      | _ -&amp;gt; () }&lt;br /&gt;  loop url&lt;br /&gt;&lt;br /&gt;rxquery {&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (url, title) &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; randomCrawl &lt;span style="color: #006080"&gt;&amp;quot;http://news.bing.com&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; (url.Contains(&lt;span style="color: #006080"&gt;&amp;quot;bing.com&amp;quot;&lt;/span&gt;) |&amp;gt; not)&lt;br /&gt;  select title&lt;br /&gt;  take 10 into gr&lt;br /&gt;  iter (printfn &lt;span style="color: #006080"&gt;&amp;quot;%s&amp;quot;&lt;/span&gt; gr)&lt;br /&gt;  }&lt;br /&gt;|&amp;gt; ObservableExtensions.Subscribe |&amp;gt; ignore&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;There are two interesting things inside the code above. The first one is “obs { … } ” code construction. This is custom implementation of &lt;a href="http://msdn.microsoft.com/en-us/library/dd233182.aspx"&gt;Computation Expression&lt;/a&gt; builder. obs is just a normal variable of a type that contains a special set of methods like: Bind, Delay, For, Combine, … and so on. The F# compiler translates the code inside the curly brackets into code calling those methods. In my case the whole expression returns the implementation of IObservable&amp;lt;T&amp;gt; type. This allows us to write imperative code representing observable source where each “yield” call returns next value (OnNext of subscribed observer is being called) and the “let!” keyword causes the program to wait for the values from the other observable source (let! keyword works like await keyword in C#). See the implementation of the builder class below:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;type ObsBuiler() = &lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Zero () = Observable.Empty(Scheduler.CurrentThread)&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Yield v = Observable.Return(v, Scheduler.CurrentThread) &lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Delay (f: _ -&amp;gt; IObservable&amp;lt;_&amp;gt;) = Observable.Defer(fun _ -&amp;gt; f())&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Combine (o1,o2) = Observable.Concat(o1,o2)&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.For (s:seq&amp;lt;_&amp;gt;, body : _ -&amp;gt; IObservable&amp;lt;_&amp;gt;) = Observable.Concat(s.Select(body))&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.YieldFrom a : IObservable&amp;lt;_&amp;gt; = a&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Bind ((o : IObservable&amp;lt;_&amp;gt;),(f : _ -&amp;gt; IObservable&amp;lt;_&amp;gt;)) = o.SelectMany(f) &lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.TryFinally((o : IObservable&amp;lt;_&amp;gt;),f : unit -&amp;gt; unit ) = Observable.Finally(o,fun _ -&amp;gt; f())&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.TryWith((o : IObservable&amp;lt;_&amp;gt;),f : Exception -&amp;gt; IObservable&amp;lt;_&amp;gt; ) = Observable.Catch(o,fun ex -&amp;gt; f(ex))&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.While (p,body) = Observable.While((fun () -&amp;gt; p()), body)&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Using (dis,body) = Observable.Using( (fun () -&amp;gt; dis), fun d -&amp;gt; body(d))&lt;br /&gt;&lt;br /&gt;let obs = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ObsBuiler()&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;The second interesting part is “rxquery { … }” code construction. This time we are using a feature called &lt;a href="http://msdn.microsoft.com/en-us/library/hh225374%28v=vs.110%29.aspx"&gt;Query Expressions&lt;/a&gt; introduced in F# 3.0 which was released few day ago during &lt;a href="http://www.buildwindows.com/"&gt;Build&lt;/a&gt; conference together with Visual Studio 11 and Windows 8. We can write queries very similar to LINQ queries and the F# compiler translate them into code calling methods like: where, select, groupBy, take and on so on. So it works like LINQ queries in C# but here we can extend the set of available methods arbitrarily !!! Look at Zip and ForkJoin methods below which are not available by default with &lt;a href="http://msdn.microsoft.com/en-us/library/hh323943%28v=VS.110%29.aspx"&gt;QueryBuilder&lt;/a&gt; implementation working with IEnumerable&amp;lt;T&amp;gt; type. Let’s see the implementation of query builder class:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;type RxQueryBuiler() =  &lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.For (s:IObservable&amp;lt;_&amp;gt;, body : _ -&amp;gt; IObservable&amp;lt;_&amp;gt;) = s.SelectMany(body)&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;select&amp;quot;&lt;/span&gt;, AllowIntoPattern=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Select (s:IObservable&amp;lt;_&amp;gt;, [&amp;lt;ProjectionParameter&amp;gt;] selector : _ -&amp;gt; _) = s.Select(selector)&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;where&amp;quot;&lt;/span&gt;, MaintainsVariableSpace=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;, AllowIntoPattern=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Where (s:IObservable&amp;lt;_&amp;gt;, [&amp;lt;ProjectionParameter&amp;gt;] predicate : _ -&amp;gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; ) = s.Where(predicate)&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;takeWhile&amp;quot;&lt;/span&gt;, MaintainsVariableSpace=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;, AllowIntoPattern=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.TakeWhile (s:IObservable&amp;lt;_&amp;gt;, [&amp;lt;ProjectionParameter&amp;gt;] predicate : _ -&amp;gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; ) = s.TakeWhile(predicate)&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;take&amp;quot;&lt;/span&gt;, MaintainsVariableSpace=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;, AllowIntoPattern=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Take (s:IObservable&amp;lt;_&amp;gt;, count) = s.Take(count)&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;skipWhile&amp;quot;&lt;/span&gt;, MaintainsVariableSpace=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;, AllowIntoPattern=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.SkipWhile (s:IObservable&amp;lt;_&amp;gt;, [&amp;lt;ProjectionParameter&amp;gt;] predicate : _ -&amp;gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; ) = s.SkipWhile(predicate)&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;skip&amp;quot;&lt;/span&gt;, MaintainsVariableSpace=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;, AllowIntoPattern=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Skip (s:IObservable&amp;lt;_&amp;gt;, count) = s.Skip(count)&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Zero () = Observable.Empty(Scheduler.CurrentThread)&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Yield (&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;) = Observable.Return(&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;count&amp;quot;&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Count (s:IObservable&amp;lt;_&amp;gt;) = Observable.Count(s)&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;all&amp;quot;&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.All (s:IObservable&amp;lt;_&amp;gt;, [&amp;lt;ProjectionParameter&amp;gt;] predicate : _ -&amp;gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; ) = s.All(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;_,&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt;(predicate))&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;contains&amp;quot;&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Contains (s:IObservable&amp;lt;_&amp;gt;, key) = s.Contains(key)&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;distinct&amp;quot;&lt;/span&gt;, MaintainsVariableSpace=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;, AllowIntoPattern=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Distinct (s:IObservable&amp;lt;_&amp;gt;) = s.Distinct()&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;exactlyOne&amp;quot;&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.ExactlyOne (s:IObservable&amp;lt;_&amp;gt;) = s.Single()&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;exactlyOneOrDefault&amp;quot;&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.ExactlyOneOrDefault (s:IObservable&amp;lt;_&amp;gt;) = s.SingleOrDefault()&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;find&amp;quot;&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Find (s:IObservable&amp;lt;_&amp;gt;, [&amp;lt;ProjectionParameter&amp;gt;] predicate : _ -&amp;gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;) = s.First(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;_,&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt;(predicate))&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Head (s:IObservable&amp;lt;_&amp;gt;) = s.First()&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;headOrDefault&amp;quot;&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.HeadOrDefault (s:IObservable&amp;lt;_&amp;gt;) = s.FirstOrDefault()&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;last&amp;quot;&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Last (s:IObservable&amp;lt;_&amp;gt;) = s.Last()&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;lastOrDefault&amp;quot;&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.LastOrDefault (s:IObservable&amp;lt;_&amp;gt;) = s.LastOrDefault()&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;maxBy&amp;quot;&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.MaxBy (s:IObservable&amp;lt;&lt;span style="color: #006080"&gt;'a&amp;gt;,  [&amp;lt;ProjectionParameter&amp;gt;] valueSelector : '&lt;/span&gt;a -&amp;gt; &lt;span style="color: #006080"&gt;'b) = s.MaxBy(new Func&amp;lt;'&lt;/span&gt;a,&lt;span style="color: #006080"&gt;'b&amp;gt;(valueSelector))&lt;br /&gt;  [&amp;lt;CustomOperation(&amp;quot;minBy&amp;quot;)&amp;gt;]&lt;br /&gt;  member this.MinBy (s:IObservable&amp;lt;'&lt;/span&gt;a&amp;gt;,  [&amp;lt;ProjectionParameter&amp;gt;] valueSelector : &lt;span style="color: #006080"&gt;'a -&amp;gt; '&lt;/span&gt;b) = s.MinBy(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;&lt;span style="color: #006080"&gt;'a,'&lt;/span&gt;b&amp;gt;(valueSelector))&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;nth&amp;quot;&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Nth (s:IObservable&amp;lt;'a&amp;gt;,  index ) = s.ElementAt(index)&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;sumBy&amp;quot;&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member inline &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.SumBy (s:IObservable&amp;lt;_&amp;gt;,[&amp;lt;ProjectionParameter&amp;gt;] valueSelector : _ -&amp;gt; _) = s.Select(valueSelector).Aggregate(Unchecked.defaultof&amp;lt;_&amp;gt;, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;_,_,_&amp;gt;( fun a b -&amp;gt; a + b)) &lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;groupBy&amp;quot;&lt;/span&gt;, AllowIntoPattern=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GroupBy (s:IObservable&amp;lt;_&amp;gt;,[&amp;lt;ProjectionParameter&amp;gt;] keySelector : _ -&amp;gt; _) = s.GroupBy(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;_,_&amp;gt;(keySelector))&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;groupValBy&amp;quot;&lt;/span&gt;, AllowIntoPattern=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GroupValBy (s:IObservable&amp;lt;_&amp;gt;,[&amp;lt;ProjectionParameter&amp;gt;] resultSelector : _ -&amp;gt; _,[&amp;lt;ProjectionParameter&amp;gt;] keySelector : _ -&amp;gt; _) = s.GroupBy(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;_,_&amp;gt;(keySelector),&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;_,_&amp;gt;(resultSelector))&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;join&amp;quot;&lt;/span&gt;, IsLikeJoin=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Join (s1:IObservable&amp;lt;_&amp;gt;,s2:IObservable&amp;lt;_&amp;gt;, [&amp;lt;ProjectionParameter&amp;gt;] s1KeySelector : _ -&amp;gt; _,[&amp;lt;ProjectionParameter&amp;gt;] s2KeySelector : _ -&amp;gt; _,[&amp;lt;ProjectionParameter&amp;gt;] resultSelector : _ -&amp;gt; _) = s1.Join(s2,&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;_,_&amp;gt;(s1KeySelector),&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;_,_&amp;gt;(s2KeySelector),&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;_,_,_&amp;gt;(resultSelector))&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;groupJoin&amp;quot;&lt;/span&gt;, AllowIntoPattern=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GroupJoin (s1:IObservable&amp;lt;_&amp;gt;,s2:IObservable&amp;lt;_&amp;gt;, [&amp;lt;ProjectionParameter&amp;gt;] s1KeySelector : _ -&amp;gt; _,[&amp;lt;ProjectionParameter&amp;gt;] s2KeySelector : _ -&amp;gt; _,[&amp;lt;ProjectionParameter&amp;gt;] resultSelector : _ -&amp;gt; _) = s1.GroupJoin(s2,&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;_,_&amp;gt;(s1KeySelector),&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;_,_&amp;gt;(s2KeySelector),&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;_,_,_&amp;gt;(resultSelector))&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;zip&amp;quot;&lt;/span&gt;, IsLikeZip=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Zip (s1:IObservable&amp;lt;_&amp;gt;,s2:IObservable&amp;lt;_&amp;gt;,[&amp;lt;ProjectionParameter&amp;gt;] resultSelector : _ -&amp;gt; _) = s1.Zip(s2,&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;_,_,_&amp;gt;(resultSelector))&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;forkJoin&amp;quot;&lt;/span&gt;, IsLikeZip=&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.ForkJoin (s1:IObservable&amp;lt;_&amp;gt;,s2:IObservable&amp;lt;_&amp;gt;,[&amp;lt;ProjectionParameter&amp;gt;] resultSelector : _ -&amp;gt; _) = s1.ForkJoin(s2,&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Func&amp;lt;_,_,_&amp;gt;(resultSelector))&lt;br /&gt;  [&amp;lt;CustomOperation(&lt;span style="color: #006080"&gt;&amp;quot;iter&amp;quot;&lt;/span&gt;)&amp;gt;]&lt;br /&gt;  member &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Iter(s:IObservable&amp;lt;_&amp;gt;, [&amp;lt;ProjectionParameter&amp;gt;] selector : _ -&amp;gt; _) = s.Do(selector)&lt;br /&gt;&lt;br /&gt;let rxquery = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; RxQueryBuiler()&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;&lt;a href="http://archive.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=15682"&gt;download&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-1845868155185680813?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/1845868155185680813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=1845868155185680813' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/1845868155185680813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/1845868155185680813'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2011/09/when-reactive-framework-meets-f-30.html' title='When the Reactive Framework meets F# 3.0'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-2749680669156909422</id><published>2011-09-15T03:02:00.001-07:00</published><updated>2011-09-15T03:23:05.205-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='Caliburn.Micro'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='WP7'/><title type='text'>Design-time support for Caliburn.Micro</title><content type='html'>&lt;p&gt;Recently me together with &lt;a href="http://bpampuch.blogspot.com/"&gt;Bartek Pampuch&lt;/a&gt; have been wondering if it’s possible to fire Caliburn.Micro’s binding process at design-time. Caliburn.Micro is a really great framework (just &lt;a href="http://www.youtube.com/watch?v=r8LMpNGAZw4"&gt;take a look&lt;/a&gt; at some of our multitouch apps based on this framework and &lt;a href="http://www.codeproject.com/KB/library/BFsharp.aspx"&gt;BFSharp&lt;/a&gt;). You just name the controls appropriately and all magic happens automatically. Controls are bound to the View Model’s properties and methods for you. The problem is that it is all happing at run time not at design time. When you are preparing the form in the Visual Studio or Expression Blend you aren’t able to see how the form will look like with bound data. In some cases such feature would very useful, especially when we want to use the sample data generated by Expression Blend or Visual Studio designers. In this post we will show you how to run Caliburn.Micro’s conventions based binding mechanism at design time.&lt;/p&gt;  &lt;p&gt;Firstly, we discovered that we can change the objects tree representing the screen and that change is not persisted back to xaml file. You can read more about this feature in my &lt;a href="http://mnajder.blogspot.com/2011/09/custom-design-time-attributes-in.html"&gt;previous post&lt;/a&gt;. Secondly, we tried to run Caliburn.Micro’s binding process to see what happens. What was really amazing is that after first try all just started working smoothly! The framework itself is implemented so well :) &lt;/p&gt;  &lt;p&gt;One of the samples provided with Caliburn.Micro release is a very simple application called GameLibrary. AddGameView.xaml file defines the screen that looks like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-hiamy-3Pi_M/TnHM9kpEvjI/AAAAAAAAAV4/hQXb5tK7VuA/s1600-h/image81.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/--ggGOmtJUWA/TnHM_W_cSgI/AAAAAAAAAV8/6uHKnqz6YfE/image_thumb4.png?imgmax=800" width="883" height="360" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;After setting up sample data generated by Visual Studio and setting attached property 'DesignTime.Enable=”True” the same form looks like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-2Ch9Gma3CM0/TnHM_5OxFgI/AAAAAAAAAWA/ule2ZzRrJaQ/s1600-h/clip_image0016.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://lh3.ggpht.com/-HKcjwS6aAYY/TnHNAnMrbgI/AAAAAAAAAWE/5gAt5BhUCAg/clip_image001_thumb3.png?imgmax=800" width="894" height="474" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In the simplest scenario all we need to run Caliburn.Micro binding process at design time is setting design time data context and enabling binding via Enable attached property. In sample above we are setting sample data generated by Visual Studio because the AddGameViewModel class doesn’t provide default constructor. Of course we could always add a default constructor in code and define view model instance in xaml file.&lt;/p&gt;  &lt;p&gt;I chose this particular form intentionally because it contains the control that hasn’t defined custom binding convention by default. The Rating control is responsible for displaying Rating property value using stars. Rating property value is 0.8 so 4 stars should be displayed. In such cases where we are using controls with custom binding convention we need to register those conventions at design time. Any application using Caliburn.Micro has a type inherited from Bootstrapper type. This type is a starting point of our application and the instance of that type very often is defined as a resource inside App.xaml file. In fact Caliburn.Micro framework is already prepared for design time scenarios because Bootstrapper type contains virtual method called StartDesignTime. Let’s override this method and register appropriate convention:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Bootstrapper&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Bootstrapper() &lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Execute.InDesignMode) StartDesignTime(); &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; StartRuntime();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Bootstrapper&amp;lt;TRootModel&amp;gt; : Bootstrapper &lt;br /&gt;{ &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AppBootstrapper : Bootstrapper&amp;lt;IShell&amp;gt; &lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; isInitializedInDesignTime = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; StartDesignTime()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.StartDesignTime();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (isInitializedInDesignTime)&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;        isInitializedInDesignTime = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br /&gt;            &lt;br /&gt;        ConfigureConventions();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ConfigureConventions()&lt;br /&gt;    {&lt;br /&gt;        ConventionManager.AddElementConvention&amp;lt;Rating&amp;gt;(Rating.ValueProperty, &lt;span style="color: #006080"&gt;&amp;quot;Value&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;ValueChanged&amp;quot;&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;The instance of AppBootstapper type can be created many times at design time so boolean flag ensures that the conventions will be registered only once. When we compile the project and reopen the form we will see something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-9AxE0cAVOJk/TnHND9Bf5BI/AAAAAAAAAWI/IU82PjMZXJQ/s1600-h/image3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-_1DAQZzXJMg/TnHNE9Aj1DI/AAAAAAAAAWM/Ffh2t90_1Rw/image_thumb1.png?imgmax=800" width="254" height="199" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This form represents a very simple scenario where the view model type has only properties of simple types like: string, double. boolean. It doesn’t contain any property of collection type or other view model type. In such scenarios Caliburn.Micro can find the appropriate type of view (control type) based on the type of view model. Let’s see another form called ResultsView.xaml to demonstrate this case:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh6.ggpht.com/-bw7wlB75d0Y/TnHNFcoPtAI/AAAAAAAAAWQ/5AWxMKUaQK4/s1600-h/image11.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-L8NsJ0ChQEQ/TnHNGfFMPGI/AAAAAAAAAWU/U-wG6nwSHXs/image_thumb5.png?imgmax=800" width="893" height="326" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a typical problem when we work with Caliburn.Micro and we cannot see anything at design time because the control is entirely collapsed :). Let’s see what happen after connecting sample data.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-ziCou0GZMcE/TnHNHUD0ZnI/AAAAAAAAAWY/ey3WI-f_TyI/s1600-h/image17.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-TP7lk0Gocao/TnHNHwGf9dI/AAAAAAAAAWc/BwH0KiO6WPc/image_thumb9.png?imgmax=800" width="891" height="482" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The list contains some elements but the font color is white so we aren’t able to read it because of the default Visual Studio background color. We can try to open this form inside Expression Blend where the background is dark or we can use custom design time attributes presented &lt;u&gt;in the previous post&lt;/u&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-6UgVLDqipD8/TnHNIx6EvbI/AAAAAAAAAWg/Q9dr1KzjasI/s1600-h/image22.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-thXtfYmP-JQ/TnHNKhP9EGI/AAAAAAAAAWk/7fsdfseCpIU/image_thumb12.png?imgmax=800" width="890" height="478" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we can see that Caliburn.Micro is not able to find view for view model type representing list item. It’s because we are using sample data mechanism from Visual Studio which generates dynamic type _.di0.GameLibrary.ViewModels.IndividualResultViewModel with the shape of the original view model type GameLibrary.ViewModels.IndividualResultViewModel. We need to change the way Caliburn.Micro is searching for view type based on specified view model type.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; StartDesignTime()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.StartDesignTime();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (isInitializedInDesignTime)&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;    isInitializedInDesignTime = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    ConfigureConventions();&lt;br /&gt;            &lt;br /&gt;    AssemblySource.Instance.AddRange(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;[] { &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(App).Assembly });&lt;br /&gt;&lt;br /&gt;    var originalLocateTypeForModelType = ViewLocator.LocateTypeForModelType;&lt;br /&gt;    Func&amp;lt;Type, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; isDesignTimeType = type =&amp;gt; type.Assembly.IsDynamic;&lt;br /&gt;    ViewLocator.LocateTypeForModelType = (modelType, displayLocation, context) =&amp;gt;&lt;br /&gt;    {&lt;br /&gt;        var type = originalLocateTypeForModelType(modelType, displayLocation, context);&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (type == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; isDesignTimeType(modelType))&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (modelType.Name == &lt;span style="color: #006080"&gt;&amp;quot;IndividualResultViewModel&amp;quot;&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                type = &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(IndividualResultView);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; type;&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    IoC.GetInstance = &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.GetInstance;&lt;br /&gt;    IoC.GetAllInstances = &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.GetAllInstances;&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Finally the list of items and generated sample data look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-hyh1LRQrJcA/TnHNLfcM5DI/AAAAAAAAAWo/0OLVR9H0aFI/s1600-h/image35.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-XZzwX8StSTo/TnHNMvGHHlI/AAAAAAAAAWs/qXBYmbAGbWo/image_thumb18.png?imgmax=800" width="862" height="598" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Attached property is not the most convenient way of extending the designer functionality because we need to write xaml code. I tried to rewrite attached property to custom behavior so we could use dra&amp;amp;drop instead of writing the code. The problem is that behaviors code is not executed at design time. But I have good news. If you are creating UI with Expression Blend you can use our attached property on the property grid like a normal property. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-Gd0O9jaQamo/TnHNNGniqhI/AAAAAAAAAWw/31aFLNV6iLQ/s1600-h/image39.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-_h5oGT46tMo/TnHNOCFTYhI/AAAAAAAAAW0/lr3iYed53kM/image_thumb20.png?imgmax=800" width="348" height="182" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was possible thanks to the usage of attribute called AttachedPropertyBrowsableForTypeAttribute decorating attached property. Everything that was presented so far works both in Silverlight and WPF environments. It’s time to reveal how the magic works.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DesignTime&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; DependencyProperty EnableProperty =&lt;br /&gt;            DependencyProperty.RegisterAttached(&lt;br /&gt;                &lt;span style="color: #006080"&gt;&amp;quot;Enable&amp;quot;&lt;/span&gt;,&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;),&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(DesignTime),&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PropertyMetadata(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PropertyChangedCallback(EnableChanged)));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #cc6633"&gt;#if&lt;/span&gt; !SILVERLIGHT &amp;amp;&amp;amp; !WP7&lt;br /&gt;        [AttachedPropertyBrowsableForTypeAttribute(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(DependencyObject))]&lt;br /&gt;&lt;span style="color: #cc6633"&gt;#endif&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; GetEnable(DependencyObject dependencyObject)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;)dependencyObject.GetValue(EnableProperty);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SetEnable(DependencyObject dependencyObject, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            dependencyObject.SetValue(EnableProperty, &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; EnableChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!Execute.InDesignMode)&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            BindingOperations.SetBinding(d, DataContextProperty, (&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;)e.NewValue ? &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Binding() : &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; DependencyProperty DataContextProperty =&lt;br /&gt;            DependencyProperty.RegisterAttached(&lt;br /&gt;                &lt;span style="color: #006080"&gt;&amp;quot;DataContext&amp;quot;&lt;/span&gt;,&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;),&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(DesignTime),&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PropertyMetadata(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PropertyChangedCallback(DataContextChanged))&lt;br /&gt;                );&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; DataContextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!Execute.InDesignMode)&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; enable = d.GetValue(EnableProperty);&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (enable == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; || ((&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;)enable) == &lt;span style="color: #0000ff"&gt;false&lt;/span&gt; || e.NewValue == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            var fe = d &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; FrameworkElement;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (fe == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;       &lt;br /&gt;            ViewModelBinder.Bind(e.NewValue, d, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(fe.Name) ? fe.GetHashCode().ToString() : fe.Name);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;I hope you find this solution useful.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://archive.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=15650"&gt;Download&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-2749680669156909422?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/2749680669156909422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=2749680669156909422' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/2749680669156909422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/2749680669156909422'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2011/09/design-time-support-for-caliburnmicro.html' title='Design-time support for Caliburn.Micro'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/--ggGOmtJUWA/TnHM_W_cSgI/AAAAAAAAAV8/6uHKnqz6YfE/s72-c/image_thumb4.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-3446431648018809536</id><published>2011-09-15T02:59:00.001-07:00</published><updated>2011-09-15T02:59:14.162-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='WP7'/><title type='text'>Custom design-time attributes in Silverlight and WPF designer</title><content type='html'>&lt;p&gt;We all know the standard &lt;a href="http://msdn.microsoft.com/en-us/library/ff602277%28v=vs.95%29.aspx"&gt;design-time attributes in the Silverlight&lt;/a&gt; designer like d:DataContext, d:DesignWidth or d:DesignHeight. Let’s see how easy we can add some new attributes.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;a href="http://lh6.ggpht.com/-GX4jxFtigCo/TnHMaiI-O-I/AAAAAAAAAVw/cY-4ev5BYrU/s1600-h/image6.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-tNMvuELzBrs/TnHMcKk-llI/AAAAAAAAAV0/X5ZibMZ7t8o/image_thumb4.png?imgmax=800" width="702" height="446" /&gt;&lt;/a&gt;&lt;/pre&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; DesignTimeProperties&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; d&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;? inDesignMode;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// Indicates whether or not the framework is in design-time mode. (Caliburn.Micro implementation)&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; InDesignMode&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (inDesignMode == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    var prop = DesignerProperties.IsInDesignModeProperty;&lt;br /&gt;                    inDesignMode = (&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;)DependencyPropertyDescriptor.FromProperty(prop, &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(FrameworkElement)).Metadata.DefaultValue;&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!inDesignMode.GetValueOrDefault(&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;) &amp;amp;&amp;amp; System.Diagnostics.Process.GetCurrentProcess()&lt;br /&gt;                            .ProcessName.StartsWith(&lt;span style="color: #006080"&gt;&amp;quot;devenv&amp;quot;&lt;/span&gt;, System.StringComparison.Ordinal))&lt;br /&gt;                        inDesignMode = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; inDesignMode.GetValueOrDefault(&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; DependencyProperty BackgroundProperty = DependencyProperty.RegisterAttached(&lt;br /&gt;            &lt;span style="color: #006080"&gt;&amp;quot;Background&amp;quot;&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(System.Windows.Media.Brush), &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(d),&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PropertyMetadata(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PropertyChangedCallback(BackgroundChanged)));&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; System.Windows.Media.Brush GetBackground(DependencyObject dependencyObject)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; (System.Windows.Media.Brush)dependencyObject.GetValue(BackgroundProperty);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SetBackground(DependencyObject dependencyObject, System.Windows.Media.Brush &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            dependencyObject.SetValue(BackgroundProperty, &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; BackgroundChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!InDesignMode)&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            d.GetType().GetProperty(&lt;span style="color: #006080"&gt;&amp;quot;Background&amp;quot;&lt;/span&gt;).SetValue(d, e.NewValue, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;







.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Great, but what about many others very useful properties ? Do we need to write them all manually? No, we don’t. I have prepared T4 template that generates code for all properties of all controls available in WPF and Silverlight assemblies. When you look carefully at the code above you will find that I am using the reflection to set the value of the property. It’s because some properties like Background are defined many times in many different controls so instead of checking the actual control type I assume that the control contains appropriate property. This assumption simplifies the implementation very much. And of course the property can be set only in design time when we are editing the form inside Expression Blend or Visual Studio. T4 template code analyzes all properties from all controls and properties with the same names but different types are skipped during generation process. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://archive.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=15650"&gt;Download&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-3446431648018809536?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/3446431648018809536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=3446431648018809536' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3446431648018809536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3446431648018809536'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2011/09/custom-design-time-attributes-in.html' title='Custom design-time attributes in Silverlight and WPF designer'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-tNMvuELzBrs/TnHMcKk-llI/AAAAAAAAAV0/X5ZibMZ7t8o/s72-c/image_thumb4.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-8185553895006718616</id><published>2011-09-04T22:46:00.001-07:00</published><updated>2011-09-08T09:53:08.942-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncCTP'/><category scheme='http://www.blogger.com/atom/ns#' term='TPL'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><title type='text'>Programming with C# asynchronous sequences</title><content type='html'>&lt;p&gt;Tomas Petricek in his last &lt;a href="http://tomasp.net/blog/async-sequences.aspx"&gt;blog post&lt;/a&gt; titled “Programming with F# asynchronous sequences” presents F# implementation of something called asynchronous sequences. In this post I will show you how the same concept can be implemented in C#. Let’s look at the sample code below to better understand what the asynchronous sequence is:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;IEnumerable&amp;lt;...&amp;gt; AsyncSeq()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;yield&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;;&lt;br /&gt;    await TaskEx.Delay(100);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;yield&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot;world!&amp;quot;&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Asynchronous sequences is a code that produces the sequence of values generated on demand (this is how the IEnumerable interface can be interpreted) but additionally does some asynchronous work during the evaluation process (await keyword). Every time the client of asynchronous sequence calls MoveNext method, next value is being evaluated. The key feature here is that the client decides when to produce next value and when to stop the processing.&lt;/p&gt;

&lt;p&gt;There are two problems with such an implementation of asynchronous sequence. Sequences in .Net world are represented with IEnumerable interface, but the interface allows only synchronous processing. Since the MoveNext method returns bool value in the interface implementation, we need to immediately decide whether the next value can be produced or not. In the asynchronous processing it can take a few minutes or even hours to provide such information. The second problem is that so far we cannot mix together await keyword (Async Ctp) with yield return/yield break keywords inside the same method body. My solution resolves those two problems and the above sequence can be implemented the fallowing way:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;IEnumerable&amp;lt;AsyncSeqItem&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; AsyncSeq()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;yield&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;yield&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; TaskEx.Delay(100);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;yield&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot;world!&amp;quot;&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;enum&lt;/span&gt; AsyncSeqItemMode&lt;br /&gt;{&lt;br /&gt;    Value, Task, Sequence&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AsyncSeqItem&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; AsyncSeqItemMode Mode { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set; }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; T Value { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set; }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Task Task { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set; }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;AsyncSeqItem&amp;lt;T&amp;gt;&amp;gt; Seq { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set; }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; AsyncSeqItem(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        Value = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;&lt;br /&gt;        Mode = AsyncSeqItemMode.Value;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; AsyncSeqItem(Task task)&lt;br /&gt;    {&lt;br /&gt;        Task = task;&lt;br /&gt;        Mode = AsyncSeqItemMode.Task;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; AsyncSeqItem(IEnumerable&amp;lt;AsyncSeqItem&amp;lt;T&amp;gt;&amp;gt; seq)&lt;br /&gt;    {&lt;br /&gt;        Seq = seq;&lt;br /&gt;        Mode = AsyncSeqItemMode.Sequence;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;implicit&lt;/span&gt; &lt;span style="color: #0000ff"&gt;operator&lt;/span&gt; AsyncSeqItem&amp;lt;T&amp;gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AsyncSeqItem&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;implicit&lt;/span&gt; &lt;span style="color: #0000ff"&gt;operator&lt;/span&gt; AsyncSeqItem&amp;lt;T&amp;gt;(Task task)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AsyncSeqItem&amp;lt;T&amp;gt;(task);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;AsyncSeqItem represents one of three following values:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Value – next value generated by the sequence&lt;/li&gt;
  &lt;li&gt;Task – some asynchronous work that needs to be awaited for before going forward&lt;/li&gt;
  &lt;li&gt;Sequence – it’s used with recursive calls and it means that we want to use tail recursion&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are two ways of consuming such sequence in the client:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AsyncSeqExtensions&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt; ToTaskEnumerable&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;AsyncSeqItem&amp;lt;T&amp;gt;&amp;gt; seq, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; continueOnCapturedContext = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&lt;br /&gt;    { ... } &lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IAsyncEnumerable&amp;lt;T&amp;gt; ToAsyncEnumerable&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;AsyncSeqItem&amp;lt;T&amp;gt;&amp;gt; seq, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; continueOnCapturedContext = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&lt;br /&gt;    { ... }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Option&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; T Value { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set; }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; HasValue { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set; }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Option()&lt;br /&gt;    {&lt;br /&gt;        HasValue = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Option(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        Value = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;&lt;br /&gt;        HasValue = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;implicit&lt;/span&gt; &lt;span style="color: #0000ff"&gt;operator&lt;/span&gt; Option&amp;lt;T&amp;gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Option&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;In the first approach we are calling ToAsyncEnumerable extension method returning the sequence of tasks. Each task wraps special type called Option&amp;lt;T&amp;gt; which can be used similarly to Nullable&amp;lt;T&amp;gt; type except that it works with value and reference types. Returning task with option object without the value means that we reached the end of the sequence. I also provide few standard LINQ operators built on the top of such a sequence semantic:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AsyncSeqExtensions&lt;br /&gt;{&lt;br /&gt;    async &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Task ForEachTaskImpl&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt; seq, Action&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt; action)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var task &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; seq)&lt;br /&gt;        {                &lt;br /&gt;            await task;&lt;br /&gt;            action(task);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Task ForEachTask&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt; seq, Action&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt; action)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ForEachTaskImpl(seq, action);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Task ForEach&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt; seq, Action&amp;lt;T&amp;gt; action)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; seq.ForEachTask(task =&amp;gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(task.Result.HasValue)             &lt;br /&gt;                action(task.Result.Value);&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    async &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Task&amp;lt;T[]&amp;gt; ToArrayImpl&amp;lt;T&amp;gt;(IEnumerable&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt; seq)&lt;br /&gt;    {&lt;br /&gt;        var list = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;T&amp;gt;();&lt;br /&gt;        await seq.ForEach(v =&amp;gt; list.Add(v));        &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; list.ToArray();&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Task&amp;lt;T[]&amp;gt; ToArray&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt; seq)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ToArrayImpl(seq);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;Task&amp;lt;Option&amp;lt;TResult&amp;gt;&amp;gt;&amp;gt; Select&amp;lt;T, TResult&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt; source,&lt;br /&gt;        Func&amp;lt;T,TResult&amp;gt; selector) { ... }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt; Where&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt; source, &lt;br /&gt;        Func&amp;lt;T, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; predicate) { ... }&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt; Take&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt; source, &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; count)  { ... }&lt;br /&gt;&lt;br /&gt;    ...&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Returning additional task object at the end of a sequence with special value allows us to use standard IEnumerable&amp;lt;T&amp;gt; interface but it’s a little bit inconvenient. In the second approach we use the IAsyncEnumerable interface from the &lt;a href="http://blogs.msdn.com/b/rxteam/archive/2010/10/28/release-notes.aspx"&gt;Reactive Framework&lt;/a&gt; library released some time ago.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; IAsyncEnumerable&amp;lt;&lt;span style="color: #0000ff"&gt;out&lt;/span&gt; T&amp;gt;&lt;br /&gt;{            &lt;br /&gt;    IAsyncEnumerator&amp;lt;T&amp;gt; GetEnumerator();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; IAsyncEnumerator&amp;lt;&lt;span style="color: #0000ff"&gt;out&lt;/span&gt; T&amp;gt; : IDisposable&lt;br /&gt;{&lt;br /&gt;    Task&amp;lt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; MoveNext();            &lt;br /&gt;    T Current { get; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AsyncEnumerable&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IAsyncEnumerable&amp;lt;TResult&amp;gt; Select&amp;lt;TSource, TResult&amp;gt;(IAsyncEnumerable&amp;lt;TSource&amp;gt; source, &lt;br /&gt;        Func&amp;lt;TSource, TResult&amp;gt; selector) { ... }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IAsyncEnumerable&amp;lt;TSource&amp;gt; Where&amp;lt;TSource&amp;gt;(IAsyncEnumerable&amp;lt;TSource&amp;gt; source, &lt;br /&gt;        Func&amp;lt;TSource, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; predicate)  { ... }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IAsyncEnumerable&amp;lt;TSource&amp;gt; Take&amp;lt;TSource&amp;gt;(IAsyncEnumerable&amp;lt;TSource&amp;gt; source, &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; n) { ... }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;This interface perfectly represents the semantic of asynchronous sequence. Rx library also provides many standard LINQ operations like: Where, Select, Take, Sum, First and so on. This allows us to write almost any LINQ query executing on the top of asynchronous sequence.&lt;/p&gt;

&lt;p&gt;Now let’s summarize what we achieved so far. We can write imperative code implementing asynchronous sequence. We can use extension method to create one of two asynchronous sequence representations. Finally we can iterate through all items in such a sequence or we can build a new sequence object using LINQ operators.&lt;/p&gt;

&lt;p&gt;The C# version of the web crawler presented in Tomas Petricek’s blog post could look like this:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AsyncSeqSample&lt;br /&gt;{&lt;br /&gt;    async &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Task CrawlBingUsingAsyncEnumerable()&lt;br /&gt;    {&lt;br /&gt;        await RandomCrawl(&lt;span style="color: #006080"&gt;&amp;quot;http://news.bing.com&amp;quot;&lt;/span&gt;)                &lt;br /&gt;            .ToAsyncEnumerable()&lt;br /&gt;            .Where(t =&amp;gt; !t.Item1.Contains(&lt;span style="color: #006080"&gt;&amp;quot;bing.com&amp;quot;&lt;/span&gt;))&lt;br /&gt;            .Select(t =&amp;gt; t.Item2)&lt;br /&gt;            .Take(10)&lt;br /&gt;            .ForEach(Console.WriteLine);&lt;br /&gt;&lt;br /&gt;        Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;the end...&amp;quot;&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    async &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Task CrawlBingUsingTaskEnumerable()&lt;br /&gt;    {&lt;br /&gt;        await RandomCrawl(&lt;span style="color: #006080"&gt;&amp;quot;http://news.bing.com&amp;quot;&lt;/span&gt;)&lt;br /&gt;            .ToTaskEnumerable()&lt;br /&gt;            .Where(t =&amp;gt; !t.Item1.Contains(&lt;span style="color: #006080"&gt;&amp;quot;bing.com&amp;quot;&lt;/span&gt;))&lt;br /&gt;            .Select(t =&amp;gt; t.Item2)&lt;br /&gt;            .Take(10)&lt;br /&gt;            .ForEach(Console.WriteLine);&lt;br /&gt;&lt;br /&gt;        Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;the end...&amp;quot;&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;AsyncSeqItem&amp;lt;Tuple&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; RandomCrawl(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; url)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; RandomCrawlLoop(url, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; HashSet&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;AsyncSeqItem&amp;lt;Tuple&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;,&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; RandomCrawlLoop(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; url, HashSet&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt; visited)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (visited.Add(url))&lt;br /&gt;        {&lt;br /&gt;            var downloadTask = DownloadDocument(url);&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;yield&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; downloadTask;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (downloadTask.Result.HasValue)&lt;br /&gt;            {&lt;br /&gt;                var doc = downloadTask.Result.Value;&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;yield&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Tuple.Create(url, GetTitle(doc));&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var link &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; ExtractLinks(doc))&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var l &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; RandomCrawlLoop(link, visited))&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;yield&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; l;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[] ExtractLinks(HtmlDocument doc)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            var q = from a &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; doc.DocumentNode.SelectNodes(&lt;span style="color: #006080"&gt;&amp;quot;//a&amp;quot;&lt;/span&gt;)&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; a.Attributes.Contains(&lt;span style="color: #006080"&gt;&amp;quot;href&amp;quot;&lt;/span&gt;)&lt;br /&gt;                    let href = a.Attributes[&lt;span style="color: #006080"&gt;&amp;quot;href&amp;quot;&lt;/span&gt;].Value&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; href.StartsWith(&lt;span style="color: #006080"&gt;&amp;quot;http://&amp;quot;&lt;/span&gt;)&lt;br /&gt;                    let endl = href.IndexOf(&lt;span style="color: #006080"&gt;'?'&lt;/span&gt;)&lt;br /&gt;                    select endl &amp;gt; 0 ? href.Substring(0, endl) : href;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; q.ToArray();&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[0];&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    async &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Task&amp;lt;Option&amp;lt;HtmlDocument&amp;gt;&amp;gt; DownloadDocument(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; url)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            var client = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; WebClient();&lt;br /&gt;            var html = await client.DownloadStringTaskAsync(url);&lt;br /&gt;            var doc = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; HtmlDocument();&lt;br /&gt;            doc.LoadHtml(html);&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Option&amp;lt;HtmlDocument&amp;gt;(doc);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (Exception)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Option&amp;lt;HtmlDocument&amp;gt;();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; GetTitle(HtmlDocument doc)&lt;br /&gt;    {&lt;br /&gt;        var title = doc.DocumentNode.SelectSingleNode(&lt;span style="color: #006080"&gt;&amp;quot;//title&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; title != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; ? title.InnerText.Trim() : &lt;span style="color: #006080"&gt;&amp;quot;Untitled&amp;quot;&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Now let’s see how ToAsyncEnumerable and ToTaskEnumerable methods have been implemented:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AsyncSeqExtensions&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IAsyncEnumerable&amp;lt;T&amp;gt; ToAsyncEnumerable&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;AsyncSeqItem&amp;lt;T&amp;gt;&amp;gt; seq, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; continueOnCapturedContext = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (seq == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #006080"&gt;&amp;quot;seq&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AnonymousAsyncEnumerable&amp;lt;T&amp;gt;(() =&amp;gt;&lt;br /&gt;        {&lt;br /&gt;            var enumerator = seq.ToTaskEnumerable(continueOnCapturedContext).GetEnumerator();&lt;br /&gt;            seq = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;; &lt;span style="color: #008000"&gt;// holding reference to seq parameter introduces memory leaks when asynchronous sequence uses recursive calls&lt;/span&gt;&lt;br /&gt;            TaskCompletionSource&amp;lt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; currentTcs = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;            Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt; currentTask = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AnonymousAsyncEnumerator&amp;lt;T&amp;gt;(&lt;br /&gt;                () =&amp;gt;&lt;br /&gt;                {&lt;br /&gt;                    currentTcs = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TaskCompletionSource&amp;lt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (CheckEndOfSeq(currentTask) == &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        currentTcs.SetResult(&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;);&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; currentTcs.Task;&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    enumerator.MoveNext();&lt;br /&gt;               &lt;br /&gt;                    enumerator.Current.ContinueWith(t =&amp;gt;&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (t.IsFaulted)&lt;br /&gt;                        {&lt;br /&gt;                            currentTcs.SetException(t.Exception);&lt;br /&gt;                        }&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&gt;                        {&lt;br /&gt;                            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!t.Result.HasValue)&lt;br /&gt;                            {&lt;br /&gt;                                currentTcs.SetResult(&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;);&lt;br /&gt;                            }&lt;br /&gt;                            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&gt;                            {&lt;br /&gt;                                currentTask = t;&lt;br /&gt;                                currentTcs.SetResult(&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                    });&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; currentTcs.Task;&lt;br /&gt;                },&lt;br /&gt;                () =&amp;gt; currentTask.Result.Value&lt;br /&gt;                );&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt; ToTaskEnumerable&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;AsyncSeqItem&amp;lt;T&amp;gt;&amp;gt; seq, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; continueOnCapturedContext = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (seq == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #006080"&gt;&amp;quot;seq&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AnonymousEnumerable&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt;(() =&amp;gt;&lt;br /&gt;        {&lt;br /&gt;            var synchronizationContext = continueOnCapturedContext ? SynchronizationContext.Current : &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            var enumerator = seq.GetEnumerator();&lt;br /&gt;            seq = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;     &lt;span style="color: #008000"&gt;// holding reference to seq parameter introduces memory leaks when asynchronous sequence uses recursive calls&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            TaskCompletionSource&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt; currentTcs = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AnonymousEnumerator&amp;lt;Task&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;&amp;gt;(&lt;br /&gt;                () =&amp;gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (CheckEndOfSeq(currentTcs) == &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;)&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                    currentTcs = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TaskCompletionSource&amp;lt;Option&amp;lt;T&amp;gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt;                    Action moveNext = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;                    moveNext = () =&amp;gt;&lt;br /&gt;                    {&lt;br /&gt;                        Start:&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; b;&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;                        {&lt;br /&gt;                            b = enumerator.MoveNext();&lt;br /&gt;                        }&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (Exception exception)&lt;br /&gt;                        {&lt;br /&gt;                            currentTcs.SetException(exception);&lt;br /&gt;                            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (b == &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;)&lt;br /&gt;                        {&lt;br /&gt;                            currentTcs.SetResult(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Option&amp;lt;T&amp;gt;());&lt;br /&gt;                        }&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&gt;                        {&lt;br /&gt;                            var c = enumerator.Current;&lt;br /&gt;                            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (c.Mode == AsyncSeqItemMode.Value)&lt;br /&gt;                            {&lt;br /&gt;                                currentTcs.SetResult(c.Value);&lt;br /&gt;                            }&lt;br /&gt;                            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (c.Mode == AsyncSeqItemMode.Task)&lt;br /&gt;                            {&lt;br /&gt;                                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (synchronizationContext != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;                                    c.Task.ContinueWith(_ =&amp;gt; synchronizationContext.Post(s =&amp;gt; ((Action)s)(), moveNext));&lt;br /&gt;                                &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&gt;                                    c.Task.ContinueWith(_ =&amp;gt; moveNext());&lt;br /&gt;                            }&lt;br /&gt;                            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (c.Mode == AsyncSeqItemMode.Sequence)&lt;br /&gt;                            {&lt;br /&gt;                                enumerator = c.Seq.GetEnumerator();&lt;br /&gt;                                &lt;span style="color: #0000ff"&gt;goto&lt;/span&gt; Start;&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                    };&lt;br /&gt;&lt;br /&gt;                    moveNext();&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br /&gt;                },&lt;br /&gt;            () =&amp;gt; currentTcs.Task&lt;br /&gt;            );&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;As you can see the implementation is really simple but the whole concept of asynchronous sequence is very powerful.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://archive.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=15651"&gt;Download&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-8185553895006718616?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/8185553895006718616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=8185553895006718616' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/8185553895006718616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/8185553895006718616'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2011/09/programming-with-c-asynchronous.html' title='Programming with C# asynchronous sequences'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-488127509333465564</id><published>2011-05-06T06:07:00.001-07:00</published><updated>2011-05-06T06:07:04.961-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='RxSandbox'/><title type='text'>Rx projects update</title><content type='html'>&lt;p&gt;In the past I have been writing about my projects related to Reactive Framework. Subsequent versions of Rx are published every one or two months and of course I have been updating my projects for my own purpose but they have not been available publicly. &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/rx/thread/527002a3-18af-4eda-8e35-760ca0006b98"&gt;Last release&lt;/a&gt; of Rx (RC0) distinguishes two versions “Stable” and “Experimental” so I think we can expect that Rx API is really close to the final version. I thought that it is a great opportunity to publish updated versions of all my projects:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://mnajder.blogspot.com/2009/08/generating-observable-events-with-t4.html"&gt;Observable event&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://mnajder.blogspot.com/2010/10/debugging-reactive-framework-rxdebugger.html"&gt;RxDebugger&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://mnajder.blogspot.com/2010/03/rxsandbox-v1.html"&gt;RxSandbox&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Basically the content of the first two projects stays the same but the RxSandbox has changed a little bit. Few new operators have been added and there are currently 69 total, additionally operators that are still in experimental state (not stable) are highlighted. I am considering moving RxSandbox application from WPF to Silverlight, that will simplify the process of deployment and the end users will be always up to date with the newest version of Rx. What do you think?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://archive.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=15376"&gt;Download&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-488127509333465564?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/488127509333465564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=488127509333465564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/488127509333465564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/488127509333465564'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2011/05/rx-projects-update.html' title='Rx projects update'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-7686897511564933595</id><published>2011-05-05T09:30:00.001-07:00</published><updated>2011-05-05T09:30:26.301-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AsyncCTP'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='WP7'/><title type='text'>Simplifying XNA game development using Async CTP or F# asynchronous workflow (GameAwaiter)</title><content type='html'>&lt;p&gt;&lt;a href="http://mnajder.blogspot.com/2011/01/async-ctp-on-wp7.html"&gt;Last time&lt;/a&gt; I have been writing about launching the Async CTP on WP7 platform. The &lt;a href="http://msdn.microsoft.com/en-us/vstudio/async/"&gt;Async CTP Refresh&lt;/a&gt;&lt;u&gt; &lt;/u&gt;has been released during MIX 2011 and finally WP7 platform is supported, so my last post is quite obsolete right now. But I hope that, after reading it, you better understand how Async CTP works underneath.&lt;/p&gt;  &lt;p&gt;This time we will go one step forward. Once we have Tasks on WP7 and two new keywords await and async in C# we can use all that to change the way we write games in XNA.&lt;/p&gt;  &lt;p&gt;If you know something about TPL and XNA framework it may seem a bit strange how I am going to mix them both since at first look TPL is all about building multithreaded applications and XNA application uses one single thread in most cases.&lt;/p&gt;  &lt;p&gt;I will not not write too much about XNA framework itself&amp;#160; (especially because I am a beginner in game development :) ) but if you try writing even a very simple 2D game you will find out that code for XNA is really hard to understand and maintain. Probably you will have many fields storing state of the game items, many boolean flags and a lot of if-then-else statements changing that state. You can say that the game is actually one big state machine. That’s what I’ve found out after writing my fist game in XNA.&lt;/p&gt;  &lt;p&gt;Async CTP can change the structure of the code dramatically so we can easily discover the flow of the game logic and what is most interesting everything is running on single thread.&lt;/p&gt;  &lt;p&gt;In this post I will show you three implementations of a very simple 2D game called Smiley. All of those implementations use XNA framework but the first one is a typical XNA approach and the last two are totally different. They are using Async CTP and the F# asynchronous workflow.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_o4bEwho21rA/TcLQjz_bT4I/AAAAAAAAAJ8/1mlfOzrJ2P4/s1600-h/image5.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_o4bEwho21rA/TcLQkUOnnGI/AAAAAAAAAKA/qbva0PL4d9s/image_thumb3.png?imgmax=800" width="505" height="349" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I took the idea for the game from the &lt;a href="http://tomasp.net/academic/reactive-thesis/thesis.pdf"&gt;Tomas Petricek’s master thesis&lt;/a&gt; and it can be presented on the three screens:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_o4bEwho21rA/TcLQk-uCxoI/AAAAAAAAAKE/2uzUQiJsbqg/s1600-h/image%5B15%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_o4bEwho21rA/TcLQlbWE7yI/AAAAAAAAAKI/cw99jfDWQ8E/image_thumb%5B6%5D.png?imgmax=800" width="337" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_o4bEwho21rA/TcLQl3Th4BI/AAAAAAAAAKM/qkTHd_UxizQ/s1600-h/image%5B16%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_o4bEwho21rA/TcLQmRVpp1I/AAAAAAAAAKQ/D6n5pWBaED8/image_thumb%5B7%5D.png?imgmax=800" width="337" height="183" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh3.ggpht.com/_o4bEwho21rA/TcLQmyGl5rI/AAAAAAAAAKU/WlVhQFzpIRw/s1600-h/image%5B17%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_o4bEwho21rA/TcLQoEVeZGI/AAAAAAAAAKY/e1xqcKk2qZ4/image_thumb%5B8%5D.png?imgmax=800" width="335" height="183" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;We tap the screen to start the game, then we have 20 seconds to hit moving Smiley image as many times as we can and at the end the number of hits is displayed for 4 seconds. The first screen appears again. The Smiley position is changing in 2 seconds periods or directly after tapping on it.&lt;/p&gt;  &lt;p&gt;Originally, that game was implemented in F# using &lt;a href="http://tomasp.net/blog/fsharp-variations-joinads.aspx"&gt;Joinads&lt;/a&gt;. A few months ago I have implemented that game also in F# using Reactive Framework and treating the IObservable&amp;lt;T&amp;gt; type as the &lt;a href="http://en.wikipedia.org/wiki/Monad_(functional_programming)"&gt;Monad&lt;/a&gt; type. With that I built my own workflow builder. I will try to describe that approach in the next blog post but now let’s come back to the subject of today’s post.&lt;/p&gt;  &lt;p&gt;As you can see in the class diagram above, all three implementations have a common base class called SmileyGameBase. That class inherits from Game class which is the main XNA component representing the whole game. And all we need to do when writing an XNA game is to override two methods: Update and Draw. Update method is responsible for recalculating the game state and the Draw method draws all game items like texts, textures and so on. Both methods are called by XNA environment (Update before Draw) many times during each second when the game is running (about 30 times per second on WP7). In our game the Draw method looks the same in all three cases but the Update is specific for each of them.&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; SmileyGameBase : Game
{
    &lt;span style="color: #008000"&gt;// ... &lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.Black);

        _spriteBatch.Begin();

        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_isRunning)
        {
            &lt;span style="color: #0000ff"&gt;float&lt;/span&gt; fontScale = 2;
            _spriteBatch.DrawString(_spriteFont, &lt;span style="color: #006080"&gt;&amp;quot;time : &amp;quot;&lt;/span&gt; + _time, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Vector2(10, 5), 
                Color.White, 0, Vector2.Zero, fontScale, SpriteEffects.None, 0);
            _spriteBatch.DrawString(_spriteFont, &lt;span style="color: #006080"&gt;&amp;quot;score : &amp;quot;&lt;/span&gt; + _score, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Vector2(500, 5), 
                Color.White, 0, Vector2.Zero, fontScale, SpriteEffects.None, 0);

            _spriteBatch.Draw(_smileyTexture, _smileyPosition, Color.White);
        }
        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;
        {
            &lt;span style="color: #0000ff"&gt;float&lt;/span&gt; fontScale = 3;
            _spriteBatch.DrawString(_spriteFont, _message, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Vector2(10, 100), 
                Color.Red, 0, Vector2.Zero, fontScale, SpriteEffects.None, 0);
        }

        _spriteBatch.End();

        &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.Draw(gameTime);
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The code is pretty simple, we have few fields representing the game state and the Draw method draws Smiley image and prints some text messages. Now let’s look at the XNA and Async CTP implementations to compare them together.&lt;/p&gt;

&lt;p&gt;This is the Async CTP implementation.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Threading.Tasks;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Input.Touch;
    
&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; SmileyGame.Common
{
    &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; AsyncXnaIntegration;
   
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AsyncCtpGame : SmileyGameBase
    {
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; GameAwaiter _gameAwaiter;

        &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; AsyncCtpGame()
        {
            _gameAwaiter = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; GameAwaiter(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;);
            Components.Add(_gameAwaiter);
        }

        &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; LoadContent()
        {
            &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.LoadContent();
            StartMenu();
        }

        async &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; StartMenu()
        {
            &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)
            {
                _message = &lt;span style="color: #006080"&gt;&amp;quot;tap to start the game ... &amp;quot;&lt;/span&gt;;
                await _gameAwaiter.Gesture(GestureType.Tap);
                _isRunning = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;
                await StartGame();
                _isRunning = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;
                _message = &lt;span style="color: #006080"&gt;&amp;quot;your score : &amp;quot;&lt;/span&gt; + _score;
                await _gameAwaiter.Delay(4000);
            }
        }

        async &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Task StartGame()
        {
            _score = 0;
            var timer = StartTimer(GameDuration);

            &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)
            {
                var match = await _gameAwaiter.WhenAny(timer,
                    _gameAwaiter.Delay(ChangePositionPeriod), _gameAwaiter.Gesture(IsSmileyClicked));
                &lt;span style="color: #0000ff"&gt;switch&lt;/span&gt; (match.Index)
                {
                    &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; 0:
                        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;

                    &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; 1:
                        _smileyPosition = GetRandomPostion();
                        &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;

                    &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; 2:
                        _smileyPosition = GetRandomPostion();
                        _score++;
                        &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;

                    &lt;span style="color: #0000ff"&gt;default&lt;/span&gt;: &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;
                }

            }
        }

        async &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Task StartTimer(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; n)
        {
            &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (n &amp;gt;= 0)
            {
                _time = n;
                await _gameAwaiter.Delay(TimerPeriod);
                n--;
            }
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;And here is the pure XNA implementation. &lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Microsoft.Xna.Framework;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Input.Touch;

&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; SmileyGame.Common
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; XnaGame : SmileyGameBase
    {
        &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; XnaGame()
        {
            _message = &lt;span style="color: #006080"&gt;&amp;quot;tap to start the game ... &amp;quot;&lt;/span&gt;;
        }

        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; TimeSpan _nextTimerTime;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; TimeSpan _nextChangePostionTime;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; TimeSpan? _nextDisplayFinalScoreTime;
        
        &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Update(GameTime gameTime)
        {
            &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.Update(gameTime);

            var gestures = GetGestures();

            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!_isRunning)
            {
                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_nextDisplayFinalScoreTime.HasValue)
                {
                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (gameTime.TotalGameTime &amp;gt; _nextDisplayFinalScoreTime.Value)
                    {
                        _nextDisplayFinalScoreTime = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;
                        _message = &lt;span style="color: #006080"&gt;&amp;quot;tap to start the game ... &amp;quot;&lt;/span&gt;;
                    }   
                }
                &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (gestures.Any(g =&amp;gt; IsGestureType(g, GestureType.Tap)))
                {
                    _isRunning = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;
                    _score = 0;
                    _time = GameDuration;
                    _nextTimerTime = gameTime.TotalGameTime + TimeSpan.FromMilliseconds(TimerPeriod);
                    _nextChangePostionTime = gameTime.TotalGameTime + TimeSpan.FromMilliseconds(ChangePositionPeriod);
                }
            }
            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;
            {                
                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (gameTime.TotalGameTime &amp;gt; _nextTimerTime )
                {
                    _time--;
                    _nextTimerTime = gameTime.TotalGameTime + TimeSpan.FromMilliseconds(TimerPeriod);
                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_time &amp;lt; 0)
                    {
                        _isRunning = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;
                        _nextDisplayFinalScoreTime = gameTime.TotalGameTime + TimeSpan.FromMilliseconds(4000);
                        _message = &lt;span style="color: #006080"&gt;&amp;quot;your score : &amp;quot;&lt;/span&gt; + _score;
                    }                    
                }
                &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (gameTime.TotalGameTime &amp;gt; _nextChangePostionTime )
                {
                    _smileyPosition = GetRandomPostion();
                    _nextChangePostionTime = gameTime.TotalGameTime + TimeSpan.FromMilliseconds(ChangePositionPeriod);
             
                }
                &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (gestures.Any(IsSmileyClicked))
                {
                    _smileyPosition = GetRandomPostion();
                    _nextChangePostionTime = gameTime.TotalGameTime + TimeSpan.FromMilliseconds(ChangePositionPeriod);
                    _score++;
                }
            }
        }

        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; IsGestureType(GestureSample gestureSample, GestureType gestureType)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; (gestureSample.GestureType &amp;amp; gestureType) == gestureType;
        }

        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; List&amp;lt;GestureSample&amp;gt; GetGestures()
        {
            var gestures = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;GestureSample&amp;gt;();
            &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (TouchPanel.IsGestureAvailable)
                gestures.Add(TouchPanel.ReadGesture());
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; gestures;
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;When we read first implementation we can easily discover the flow of the program and the order of particular pieces of code look natural. In the pure XNA approach it is really hard to understand how the game works internally and how to extend them. Let’s image that we would like to display sequentially “3” “2” “1” “start” just after first tap in 1 second periods. Think how to do it in each of these two approaches ?&lt;/p&gt;

&lt;p&gt;So now lets go to F# implementation. F# has something called asynchronous workflow which was available for F# developers long before Async CTP (and in fact it was the inspiration for Async CTP authors) the F# implementation is very similar to Async CTP one.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; SmileyGame.FSharp

open SmileyGame.Common
open AsyncXnaIntegration
open SmileyGame.FSharp.Extensions
open Microsoft.Xna.Framework.Input.Touch

type FSharpGame() &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt; =
  inherit SmileyGameBase()
  let _gameAwaiter = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; GameAwaiter(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;)
  &lt;span style="color: #0000ff"&gt;do&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Components.Add(_gameAwaiter)

  &lt;span style="color: #008000"&gt;// access to protected members&lt;/span&gt;
  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.set_smileyPosition p = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._smileyPosition &amp;lt;- p
  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.set_time t = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._time &amp;lt;- t 
  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.set_score s = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._score &amp;lt;- s
  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.set_message m = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._message &amp;lt;- m
  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.set_isRunning r = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._isRunning  &amp;lt;- r
  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.inc_score() = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._score &amp;lt;- &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._score + 1  
  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.get_score = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._score
  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.get_TimerPeriod = SmileyGameBase.TimerPeriod
  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.get_GameDuration = SmileyGameBase.GameDuration  
  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.get_ChangePositionPeriod = SmileyGameBase.ChangePositionPeriod  
  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.IsSmileyClicked g = &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.IsSmileyClicked g
  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GetRandomPostion() = &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.GetRandomPostion()
  
  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.StartTimer n =
    let n = &lt;span style="color: #0000ff"&gt;ref&lt;/span&gt; n
    async {      
      &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; !n &amp;gt;= 0 &lt;span style="color: #0000ff"&gt;do&lt;/span&gt;        
        &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.set_time !n
        &lt;span style="color: #0000ff"&gt;do&lt;/span&gt;! _gameAwaiter.Delay(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.get_TimerPeriod) |&amp;gt; Async.AwaitTask
        n := !n - 1
    }

  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.StartGame() =
    async {
    &lt;span style="color: #0000ff"&gt;do&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.set_score 0
    let timer = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.StartTimer(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.get_GameDuration) |&amp;gt; Async.ToTask
    let c = &lt;span style="color: #0000ff"&gt;ref&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; !c &lt;span style="color: #0000ff"&gt;do&lt;/span&gt;
      let! m = _gameAwaiter.WhenAny(timer,_gameAwaiter.Delay(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.get_ChangePositionPeriod), _gameAwaiter.Gesture(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.IsSmileyClicked)) |&amp;gt; Async.AwaitTask
      match m.Index with
      | 0 -&amp;gt; c := &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;
      | 1 -&amp;gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.set_smileyPosition(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GetRandomPostion())
      | 2 -&amp;gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.set_smileyPosition(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GetRandomPostion()) ; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.inc_score()
      | _ -&amp;gt; ()
    }

  member &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.StartMenu() =
    async {
      &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt; &lt;span style="color: #0000ff"&gt;do&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.set_message &lt;span style="color: #006080"&gt;&amp;quot;tap to start the game ... &amp;quot;&lt;/span&gt;
        let! _ = _gameAwaiter.Gesture(GestureType.Tap) |&amp;gt; Async.AwaitTask
        &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.set_isRunning &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;do&lt;/span&gt;! &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.StartGame()
        &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.set_isRunning &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.set_message (&lt;span style="color: #006080"&gt;&amp;quot;your score : &amp;quot;&lt;/span&gt; + (&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.get_score).ToString() )
        &lt;span style="color: #0000ff"&gt;do&lt;/span&gt;! _gameAwaiter.Delay(&lt;span style="color: #0000ff"&gt;float&lt;/span&gt; 4000) |&amp;gt; Async.AwaitTask
    }

  &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.LoadContent() =
    &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.LoadContent()
    &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.StartMenu() |&amp;gt; Async.StartImmediate &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Fine, but how does it work? All I had to do was to implement class GameAwaiter deriving from GameComponent which means that we can add it to the components stored inside Game class and its Update method will be called automatically when Game’s Update method is being called. GameAwaiter gives us basically a few public methods such as Gesture, Delay and WhenAny. All of them return Task object which means that at some point in the future the result will come. Let’s see the details:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Threading.Tasks;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Microsoft.Xna.Framework;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Input.Touch;

&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; AsyncXnaIntegration
{
    &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; AsyncXnaIntegration;

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; GameAwaiter : GameComponent
    {
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; List&amp;lt;Job&amp;gt; _jobs = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;Job&amp;gt;();

        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; GameAwaiter(Game game)
            : &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;(game)
        { }

        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Task Delay(TimeSpan interval)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; RegisterJob(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TimerJob { Interval = interval });
        }
        
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Task Delay()
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; RegisterJob(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TimerJob());
        }
     
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Task While(Func&amp;lt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; condition)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; RegisterJob(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; WhileJob { Condition = condition });
        }
  
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Task&amp;lt;GestureSample[]&amp;gt; Gesture(Func&amp;lt;GestureSample, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; predicate)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; RegisterJob(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; GestureJob { GestureCondition = predicate });
        }

        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; TryDisposeTask(Task tt)
        {
            var job = _jobs.FirstOrDefault(j =&amp;gt; j.TaskO == tt);
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (job != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
                job.IsDisposed = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;
        }

        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Update(GameTime gametime)
        {
            var state = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; State { GameTime = gametime, TouchState = TouchPanel.GetState(), };
            &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (TouchPanel.IsGestureAvailable)
                state.Gestures.Add(TouchPanel.ReadGesture());

            &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var job &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; _jobs.ToArray())
            {      
                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (job.IsDisposed || job.Update(state))                
                    _jobs.Remove(job);
            }
        }


        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Task&amp;lt;T&amp;gt; RegisterJob&amp;lt;T&amp;gt;(Job&amp;lt;T&amp;gt; job)
        {
            _jobs.Add(job);
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; job.Task;
        }

        &lt;span style="color: #cc6633"&gt;#region&lt;/span&gt; inner types

        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; State
        {
            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; GameTime GameTime;
            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; TouchCollection TouchState;
            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; List&amp;lt;GestureSample&amp;gt; Gestures = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;GestureSample&amp;gt;();
        }

        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Job
        {
            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; IsDisposed { get; set; }
            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; Task TaskO { get; }

            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; Update(State state);
        }

        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Job&amp;lt;T&amp;gt; : Job
        {
            &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; TaskCompletionSource&amp;lt;T&amp;gt; _source = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TaskCompletionSource&amp;lt;T&amp;gt;();
            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Task&amp;lt;T&amp;gt; Task { get { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _source.Task; } }
            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; Task TaskO { get { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Task; } }
        }

        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; TimerJob : Job&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;
        {
            &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; TimeSpan? StartTime;
            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; TimeSpan? Interval;

            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; Update(State state)
            {
                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!Interval.HasValue)
                {
                    _source.TrySetResult(&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);
                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;
                }

                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!StartTime.HasValue)
                    StartTime = state.GameTime.TotalGameTime;

                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (state.GameTime.TotalGameTime - StartTime &amp;gt;= Interval)
                {
                    _source.TrySetResult(&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);
                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;
                }

                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;
            }
        }

        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; WhileJob : Job&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;
        {
            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Func&amp;lt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; Condition;

            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; Update(State state)
            {
                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Condition())
                {
                    _source.TrySetResult(&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);
                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;
                }
                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;
            }
        }

        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; GestureJob : Job&amp;lt;GestureSample[]&amp;gt;
        {
            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Func&amp;lt;GestureSample, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; GestureCondition;

            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; Update(State state)
            {
                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (state.Gestures.Count &amp;gt; 0)
                {
                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (GestureCondition == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
                    {
                        _source.TrySetResult(state.Gestures.ToArray());
                        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;
                    }

                    var gestures = state.Gestures.Where(GestureCondition).ToArray();
                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (gestures.Length &amp;gt; 0)
                    {
                        _source.TrySetResult(gestures);
                        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;
                    }
                }

                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;
            }
        }

        &lt;span style="color: #cc6633"&gt;#endregion&lt;/span&gt;
    
    }


&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; GameAwaiterExtensions
    {
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Task&amp;lt;Branch&amp;gt; WhenAny(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; GameAwaiter gameAwaiter, &lt;span style="color: #0000ff"&gt;params&lt;/span&gt; Task[] tasks)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GameAwaiterExtensions.WhenAny(tasks)
                .ContinueWith(t =&amp;gt;
                {
                    &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;
                    {
                        &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var tt &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; tasks)
                            gameAwaiter.TryDisposeTask(tt);
                        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; t.Result;
                    }
                    &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (Exception exception)
                    {
                        Debugger.Break();
                        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; t.Result;
                    }
                }, TaskContinuationOptions.ExecuteSynchronously);
        }

        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Task&amp;lt;Branch&amp;gt; WhenAny(&lt;span style="color: #0000ff"&gt;params&lt;/span&gt; Task[] tasks)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; TaskEx
                .WhenAny(tasks)
                .ContinueWith(t =&amp;gt;
                {
                    var task = t.Result;
                    var taskType = task.GetType();
                    &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;

                    &lt;span style="color: #008000"&gt;// we cannot read nonpublic types via reflection in silverlight &lt;/span&gt;
                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (taskType.IsGenericType &amp;amp;&amp;amp; taskType.GetGenericArguments()[0].IsPublic)
                        &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; = task.GetType().GetProperty(&lt;span style="color: #006080"&gt;&amp;quot;Result&amp;quot;&lt;/span&gt;).GetValue(task, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);

                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Branch { Index = Array.IndexOf(tasks, task), Value = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; };                    
                }, TaskContinuationOptions.ExecuteSynchronously);
        }

        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Task Delay(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; GameAwaiter gameAwaiter, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; milliseconds)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; gameAwaiter.Delay(TimeSpan.FromMilliseconds(milliseconds));
        }

        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Task&amp;lt;GestureSample[]&amp;gt; Gesture(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; GameAwaiter gameAwaiter, GestureType gestureType)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; gameAwaiter.Gesture(g =&amp;gt; (g.GestureType &amp;amp; gestureType) == gestureType);
        }

        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt;  Task&amp;lt;GestureSample[]&amp;gt; Gesture(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; GameAwaiter gameAwaiter)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; gameAwaiter.Gesture(g =&amp;gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);
        }
    }


    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Branch
    {
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Index;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; Value;
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The last thing I would like to mention is a really tricky stuff :) What was really important for me when writing GameAwaiter, was the linear execution of the code. I didn’t want to introduce any new threads or use the SynchronizationContext object underneath. XNA framework calls Update and Draw methods one by one in the single thread many times per second and next iteration can start after the previous one has finished, so it’s really easy to debug such a single-threaded application. The problem is that, by default, Async CTP uses SynchronizationContext‘s Post method when the continuation delegate passed to TaskAwaiter object is called. Of course that happens if any context exists and in XNA case the “SynchronizationContext.Current” property returns the instance of the context. The latest version of Async CTP gives us the ability to configure that behavior but we would need to call “task.ConfigureAwait(false)” in every place where we use await keyword. That would be pretty inconvenient. So I have implemented my own extension method for Task object, that creates appropriately configured awaiter object.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; AsyncXnaIntegration
{    
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Extensions
    {
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; ConfiguredTaskAwaitable.ConfiguredTaskAwaiter GetAwaiter(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; Task task)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; task.ConfigureAwait(&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;).GetAwaiter();
        }

        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; ConfiguredTaskAwaitable&amp;lt;T&amp;gt;.ConfiguredTaskAwaiter GetAwaiter&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; Task&amp;lt;T&amp;gt; task)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; task.ConfigureAwait(&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;).GetAwaiter();
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now we need to find a way to force C# compiler to use our extension method instead of that provided in AsyncCtpLibrary_Phone.dll library. We can do it for example by placing “using AsyncXnaIntegration;” statement inside the namespace declaration in all files where we are using Async CTP. Thanks to that little trick our method will be “closer” than all others defined outside the namespace declaration.&lt;/p&gt;

&lt;p&gt;Of course GameAwaiter class can be extended (and it most likely will be) by many other useful methods simplifying use of phone’s Keyboard, Geo-Position or Accelerometer APIs, but this is just a proof of concept. As always I encourage you to download the &lt;a href="http://archive.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=15375"&gt;source code&lt;/a&gt; and definitely play the Smiley game :) Thanks for reading this post and I hope it will open your eyes for many new very interesting scenarios where the Async CTP can change XNA game development.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;a href="http://archive.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=15375"&gt;downlaod&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-7686897511564933595?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/7686897511564933595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=7686897511564933595' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/7686897511564933595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/7686897511564933595'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2011/05/simplifying-xna-game-development-using.html' title='Simplifying XNA game development using Async CTP or F# asynchronous workflow (GameAwaiter)'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_o4bEwho21rA/TcLQkUOnnGI/AAAAAAAAAKA/qbva0PL4d9s/s72-c/image_thumb3.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-8847461738748569084</id><published>2011-01-21T03:45:00.001-08:00</published><updated>2011-01-21T03:45:33.369-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncCTP'/><category scheme='http://www.blogger.com/atom/ns#' term='WP7'/><title type='text'>Async CTP on WP7</title><content type='html'>&lt;p&gt;In this post I will show you how to use &lt;a href="http://msdn.microsoft.com/en-us/vstudio/gg316360"&gt;Async CTP&lt;/a&gt; released during last PDC conference inside your Windows Phone application. Async CTP extends two .Net platform languages C# and VB giving us a new way of writing asynchronous code. There are two main aspects of this project: new C#/VB compiler (two new keywords: async, await) and library AsyncCtpLibrary.dll. When the compiler sees asynchronous method it generates IL code (which we will see in details further) and that code is using some types from the mentioned library. The problem is that so far we have only two versions of library: .Net and Silverlight. So in this post I will show you how we can use&amp;#160; Async CTP on Windows Phone 7 despite these limitations.&lt;/p&gt;  &lt;p&gt;The first thing we need to do before we write our first asynchronous method in the WP7 project is we need to add the reference to Silverlight version of the library AsyncCtpLibrary_Silverlight.dll. Just after doing it Visual Studio shows&amp;#160; a warning: “Adding a reference to a Silverlight assembly may lead to unexpected application behavior. Do you want to continue?”. The problem is that the assembly is compiled under full version of Silverlight and the Windows Phone does not contain the full version but some subset of it running on the top of .Net compact framework. So if we execute some code from such a assembly which is using types that are not available on the phone we will get the runtime exception. The key element of the AsyncCtpLibrary are Tasks and unfortunately they are not running on the phone throwing exception at runtime. The question is: can we use Async CTP without Tasks ? Of course we can! The whole mechanism behind asynchronous methods doesn’t force us to use the instance of type Task followed by await keyword. That type needs to contain method (instance or extension method) called GetAwaiter returning any type that contains appropriate pair of methods (instance or extension) BeginAwait and EndAwait. And all I did is I implemented such a matching type.&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;enum&lt;/span&gt; AwaiterResultType
{
    Completed,
    Failed,
    Cancelled
}

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AwaiterResult&amp;lt;T&amp;gt;
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; AwaiterResultType ResultType { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Exception Exception { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; T Value { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set; }

    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; AwaiterResult() { }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; AwaiterResult&amp;lt;T&amp;gt; Completed(T result)
    {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AwaiterResult&amp;lt;T&amp;gt; { ResultType = AwaiterResultType.Completed, Value = result };
    }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; AwaiterResult&amp;lt;T&amp;gt; Failed(Exception exception)
    {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AwaiterResult&amp;lt;T&amp;gt; { ResultType = AwaiterResultType.Failed, Exception = exception };
    }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; AwaiterResult&amp;lt;T&amp;gt; Cancelled()
    {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AwaiterResult&amp;lt;T&amp;gt; { ResultType = AwaiterResultType.Cancelled };
    }
}

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Awaiter&amp;lt;T&amp;gt;
{
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; SynchronizationContext Context { get; set; }
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; IsSynchronized { get; set; }
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Action _continuation;

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; AwaiterResult&amp;lt;T&amp;gt; Result { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set; }

    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Awaiter() { }

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Awaiter&amp;lt;T&amp;gt; GetAwaiter()
    {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;;
    }

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; BeginAwait(Action continuation)
    {
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Result != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;

        _continuation += continuation;
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;
    }

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; T EndAwait()
    {
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Result == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
            &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; InvalidOperationException(&lt;span style="color: #006080"&gt;&amp;quot;Awaiter does not contain the result yet.&amp;quot;&lt;/span&gt;);

        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Result.ResultType == AwaiterResultType.Completed)
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Result.Value;

        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Result.ResultType == AwaiterResultType.Failed)
            &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; Result.Exception;

        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;default&lt;/span&gt;(T); &lt;span style="color: #008000"&gt;// if cancelled&lt;/span&gt;
    }

    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; OnResult(AwaiterResult&amp;lt;T&amp;gt; result)
    {
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (result == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #006080"&gt;&amp;quot;result&amp;quot;&lt;/span&gt;);
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Result != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; InvalidOperationException(&lt;span style="color: #006080"&gt;&amp;quot;The result can be provided only once.&amp;quot;&lt;/span&gt;);

        Result = result;
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (IsSynchronized &amp;amp;&amp;amp; Context != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
        {
            Context.Post(o =&amp;gt;
                             {
                                 &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_continuation != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
                                     _continuation();
                                 _continuation = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;
                             }, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);
            Context = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;
        }
        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;
        {
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_continuation != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
                _continuation();
            _continuation = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;
        }
    }

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Awaiter&amp;lt;T&amp;gt; Create(Action&amp;lt;Action&amp;lt;AwaiterResult&amp;lt;T&amp;gt;&amp;gt;&amp;gt; resultProvider, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; synchronizeWithCurrentContext = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)
    {
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (resultProvider == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #006080"&gt;&amp;quot;resultProvider&amp;quot;&lt;/span&gt;);

        var awaiter = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Awaiter&amp;lt;T&amp;gt; { IsSynchronized = synchronizeWithCurrentContext };
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (synchronizeWithCurrentContext)
            awaiter.Context = SynchronizationContext.Current;
        resultProvider(awaiter.OnResult);
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; awaiter;
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The key class here is Awaiter class containing appropriate three methods: GetAwaiter, BeginAwait and EndAwait. This is an abstraction of asynchronous work (very similar to Task type) which at some point in time is finishing its work in one of three possible states: an exception could be thrown, maybe someone cancelled the execution or the work has been completed correctly returning some result. The constructor is private so the factory method called Create is the only way to create an instance of Awaiter type. So let’s see how we can use it:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AwaiterEx
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Awaiter&amp;lt;T&amp;gt; Run&amp;lt;T&amp;gt;(Func&amp;lt;T&amp;gt; action)
    {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Awaiter&amp;lt;T&amp;gt;.Create(resultProvider =&amp;gt;
        {
            ThreadPool.QueueUserWorkItem(o =&amp;gt;
            {
                &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;
                {
                    var result = action();
                    resultProvider(AwaiterResult&amp;lt;T&amp;gt;.Completed(result));
                }
                &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (Exception exception)
                {
                    resultProvider(AwaiterResult&amp;lt;T&amp;gt;.Failed(exception));
                }
            },&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);
        });         
    }

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Awaiter&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; Delay(TimeSpan timeSpan)
    {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Awaiter&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;.Create(resultProvider =&amp;gt;
        {
            var timer = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Timer(o =&amp;gt; resultProvider(AwaiterResult&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;.Completed(&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)));
            timer.Change((&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;)timeSpan.TotalMilliseconds, -1);
        });
    }
}

async &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Sample()
{
    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; intResult = await AwaiterEx.Run(() =&amp;gt;
    {
        Thread.Sleep(3000);
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; 123;
    });
    MessageBox.Show(&lt;span style="color: #006080"&gt;&amp;quot;Completed: &amp;quot;&lt;/span&gt; + intResult);

    await AwaiterEx.Delay(TimeSpan.FromSeconds(3));
    MessageBox.Show(&lt;span style="color: #006080"&gt;&amp;quot;After 3 seconds...&amp;quot;&lt;/span&gt;);
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now let’s look at simplified version of what compiler is generating underneath to allow us to write synchronously looking code running asynchronously.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SampleInternals()
{
    Awaiter&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt; awaiter1 = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;
    Awaiter&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; awaiter2 = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;
    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; state = 0;
    
    Action action = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;
    action = () =&amp;gt;
    {
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (state == 1) &lt;span style="color: #0000ff"&gt;goto&lt;/span&gt; JUMP_LABEL_1;
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (state == 2) &lt;span style="color: #0000ff"&gt;goto&lt;/span&gt; JUMP_LABEL_2;
        
        awaiter1 = AwaiterEx.Run(() =&amp;gt;
        {
            Thread.Sleep(3000);
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; 123;
        }).GetAwaiter();
        state = 1;
        
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (awaiter1.BeginAwait(action))
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;
        
        JUMP_LABEL_1:
        var intResult = awaiter1.EndAwait();
        MessageBox.Show(&lt;span style="color: #006080"&gt;&amp;quot;Completed: &amp;quot;&lt;/span&gt; + intResult);


        awaiter2 = AwaiterEx.Delay(TimeSpan.FromSeconds(3)).GetAwaiter();
        state = 2;

        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (awaiter2.BeginAwait(action))
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;

        JUMP_LABEL_2:
        awaiter2.EndAwait();
        
        MessageBox.Show(&lt;span style="color: #006080"&gt;&amp;quot;After 3 seconds...&amp;quot;&lt;/span&gt;);
    };

    action();         
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The last thing worth mentioning is how to write asynchronous method returning some value. Asynchronous methods have two limitations: void, Task and Task&amp;lt;T&amp;gt; are the only valid return types and out parameters are not allowed. As we said before Tasks under WP7 don’t work so we cannot return Task object. In fact the solution is very simple:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AwaiterEx
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Awaiter&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; BeginWriteAwaiter(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; Stream stream, &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] buffer, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; offset, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; numBytes)
    {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Awaiter&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;.Create(resultProvider =&amp;gt;
        {
            &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;
            {
                stream.BeginWrite(buffer, offset, numBytes, o =&amp;gt;
                {
                    &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;
                    {
                        stream.EndWrite(o);
                        resultProvider(AwaiterResult&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;.Completed(&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;));
                    }
                    &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (Exception exception)
                    {
                        resultProvider(AwaiterResult&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;.Failed(exception));
                    }
                }, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);
            }
            &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (Exception exception)
            {
                resultProvider(AwaiterResult&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;.Failed(exception));
            }
        });
    }
}

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Awaiter&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; WriteFileAwaiter(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; path, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; text)
{
    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Awaiter&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;.Create(async resultProvider =&amp;gt;
    {
        &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;
        {
            &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var stream = IsolatedStorageFile.OpenFile(path, FileMode.Create))  
                &lt;span style="color: #008000"&gt;// caution: in fact the stream is running synchronously on WP7&lt;/span&gt;
            {
                var data = Encoding.Unicode.GetBytes(text);
                await stream.BeginWriteAwaiter(data, 0, data.Length);
                resultProvider(AwaiterResult&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;.Completed(&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;));
            }
        }
        &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (Exception exception)
        {
            resultProvider(AwaiterResult&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;.Failed(exception));
        }
    });
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I encourage you to &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=14873"&gt;download sources&lt;/a&gt; with attached samples and play with Async CTP on WP7 because it changes a lot in terms of writing asynchronous code. AsyncCtpLibrary library provides TaskEx class with few very useful methods so you can find counterpart in my library called AwaiterEx with following API:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AwaiterEx
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Awaiter&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt; DownloadStringAwaiter(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; WebClient webClient, Uri uri) { ... }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Awaiter&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; BeginWriteAwaiter(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; Stream stream, &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] buffer, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; offset, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; numBytes) { ... }
  
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Awaiter&amp;lt;T&amp;gt; ToAwaiter&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IObservable&amp;lt;T&amp;gt; observable) { ... }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Awaiter&amp;lt;T[]&amp;gt; ToAwaiterAll&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IObservable&amp;lt;T&amp;gt; observable) { ... }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IObservable&amp;lt;T&amp;gt; ToObservable&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; Awaiter&amp;lt;T&amp;gt; awaiter) { ... }
    
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Awaiter&amp;lt;T[]&amp;gt; WhenAll&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;Awaiter&amp;lt;T&amp;gt;&amp;gt; awaiters) { ... }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Awaiter&amp;lt;T[]&amp;gt; WhenAll&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;params&lt;/span&gt; Awaiter&amp;lt;T&amp;gt;[] awaiters) { ... }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Awaiter&amp;lt;T&amp;gt; Run&amp;lt;T&amp;gt;(Func&amp;lt;T&amp;gt; action) { ... }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Awaiter&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; Delay(TimeSpan timeSpan) { ... }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Have fun and let me know if you liked it or not. &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=14873"&gt;Download&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-8847461738748569084?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/8847461738748569084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=8847461738748569084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/8847461738748569084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/8847461738748569084'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2011/01/async-ctp-on-wp7.html' title='Async CTP on WP7'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-3106076435624910794</id><published>2010-12-09T09:55:00.001-08:00</published><updated>2010-12-09T09:55:07.894-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><title type='text'>Recording of my presentation "Introduction to F#” has been published</title><content type='html'>&lt;p&gt;&lt;a href="http://mnajder.blogspot.com/2010/10/after-microsoft-technology-summit-2010.html"&gt;Few weeks&lt;/a&gt; ago I promised recording of my presentation given during MTS 2010 conference, &lt;a href="http://vimeo.com/17615280"&gt;here&lt;/a&gt; it is. Enjoy!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-3106076435624910794?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/3106076435624910794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=3106076435624910794' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3106076435624910794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3106076435624910794'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2010/12/recording-of-my-presentation-to-f-has.html' title='Recording of my presentation &amp;quot;Introduction to F#” has been published'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-3331766552472744760</id><published>2010-11-07T23:43:00.001-08:00</published><updated>2010-11-07T23:43:30.044-08:00</updated><title type='text'>Currying in C#</title><content type='html'>&lt;p&gt;During reviewing samples for &lt;a href="http://msdn.microsoft.com/en-us/vstudio/async.aspx"&gt;Async Ctp&lt;/a&gt; I have found such code:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var cts = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CancellationTokenSource();
btnCancel.Click += cts.EventHandler;  &lt;span style="color: #008000"&gt;// !!!!&lt;/span&gt;
 
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Extensions
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; EventHandler(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; CancellationTokenSource cts, 
        &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)
    {
        cts.Cancel();
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Did you know it was possible ?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-3331766552472744760?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/3331766552472744760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=3331766552472744760' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3331766552472744760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3331766552472744760'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2010/11/currying-in-c.html' title='Currying in C#'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-4723771391043991551</id><published>2010-10-27T14:55:00.001-07:00</published><updated>2010-10-27T14:55:13.328-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><title type='text'>After Microsoft Technology Summit 2010</title><content type='html'>&lt;p&gt;This year again I had the opportunity to speak during &lt;a href="http://www.mtskonferencja.pl/"&gt;MTS 2010&lt;/a&gt; conference in Warsaw. &lt;a href="http://mnajder.blogspot.com/2009/11/after-microsoft-technology-summit-2009.html"&gt;Last time&lt;/a&gt; I have been talking about WF4 and this time the title of my talk was &lt;a href="http://www.mtskonferencja.pl/rejestracja/sessions.aspx"&gt;“Introduction to F#”&lt;/a&gt;. I would like to thank all attendees for coming! All resources presented during the session are available for download &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=14210"&gt;here&lt;/a&gt;, &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=12939"&gt;here&lt;/a&gt; and &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=14211"&gt;here&lt;/a&gt;. In the near future I’ll publish recording from this session.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-4723771391043991551?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/4723771391043991551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=4723771391043991551' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/4723771391043991551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/4723771391043991551'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2010/10/after-microsoft-technology-summit-2010.html' title='After Microsoft Technology Summit 2010'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-4688297035455393910</id><published>2010-10-25T01:23:00.001-07:00</published><updated>2011-05-06T06:12:42.493-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='T4'/><category scheme='http://www.blogger.com/atom/ns#' term='ExpressionTrees'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><title type='text'>Debugging Reactive Framework (RxDebugger) and Linq to objects (LinqDebugger)</title><content type='html'>&lt;p&gt;&lt;font color="#ff0000"&gt;[&lt;a href="http://mnajder.blogspot.com/2011/05/rx-projects-update.html"&gt;New version&lt;/a&gt; (2011.05.06)]&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;[Project download has been upgraded to the newest version of Rx (Build v1.0.2787.0) and VS2010 ] &lt;/font&gt;&lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=14361"&gt;&lt;font color="#ff0000"&gt;download&lt;/font&gt;&lt;/a&gt;     &lt;br /&gt;&lt;font color="#ff0000"&gt;(Changes: projects converted to VS2010, sample project for RxDebugger added)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;In this post I will present two projects &lt;strong&gt;LinqDebugger&lt;/strong&gt; and &lt;strong&gt;RxDebugger&lt;/strong&gt;. Few months ago after reading Bart De Smet’s great &lt;a href="http://community.bartdesmet.net/blogs/bart/archive/2009/04/23/linq-to-objects-debugging.aspx"&gt;post&lt;/a&gt; about tracing execution of the Linq to objects queries I was wondering if it was be possible to implement the same concept but in more general way. If we want to trace the execution of all of the Linq operators using described approach we would have to implement many extension methods, one for each Linq operator. How to avoid this ? &lt;strong&gt;LinqDebugger&lt;/strong&gt; is the the answer ;)&lt;strong&gt; . &lt;/strong&gt;If you are wondering what the lazy evaluation is and how to debug Linq to object queries this project can be very useful. Let’s see a very simple query :&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var q =
    from i &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; Enumerable.Range(0, 12)
    &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; i &amp;gt; 5 &amp;amp;&amp;amp; i % 2 == 0
    select i.ToString(&lt;span style="color: #006080"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;);

&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var s &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; q)
    Console.WriteLine(s);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now let’s debug that query:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var q =
    from i &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; Enumerable.Range(0, 12).AsDebuggable()
    &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; i &amp;gt; 5 &amp;amp;&amp;amp; i % 2 == 0
    select i.ToString(&lt;span style="color: #006080"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;);

&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var s &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; q)
    Console.WriteLine(s); &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;After running this code you will find the following text on the console:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;Select creation
Select begin
Where creation
Where begin
 predicate i =&amp;gt; ((i &amp;gt; 5) &amp;amp;&amp;amp; ((i % 2) = 0)) : (0) =&amp;gt; False
 predicate i =&amp;gt; ((i &amp;gt; 5) &amp;amp;&amp;amp; ((i % 2) = 0)) : (1) =&amp;gt; False
 predicate i =&amp;gt; ((i &amp;gt; 5) &amp;amp;&amp;amp; ((i % 2) = 0)) : (2) =&amp;gt; False
 predicate i =&amp;gt; ((i &amp;gt; 5) &amp;amp;&amp;amp; ((i % 2) = 0)) : (3) =&amp;gt; False
 predicate i =&amp;gt; ((i &amp;gt; 5) &amp;amp;&amp;amp; ((i % 2) = 0)) : (4) =&amp;gt; False
 predicate i =&amp;gt; ((i &amp;gt; 5) &amp;amp;&amp;amp; ((i % 2) = 0)) : (5) =&amp;gt; False
 predicate i =&amp;gt; ((i &amp;gt; 5) &amp;amp;&amp;amp; ((i % 2) = 0)) : (6) =&amp;gt; True
Where end 6
 selector i =&amp;gt; i.ToString(&lt;span style="color: #006080"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;) : (6) =&amp;gt; 6,00 zł
Select end 6,00 zł
6,00 zł
Select begin
Where begin
 predicate i =&amp;gt; ((i &amp;gt; 5) &amp;amp;&amp;amp; ((i % 2) = 0)) : (7) =&amp;gt; False
 predicate i =&amp;gt; ((i &amp;gt; 5) &amp;amp;&amp;amp; ((i % 2) = 0)) : (8) =&amp;gt; True
Where end 8
 selector i =&amp;gt; i.ToString(&lt;span style="color: #006080"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;) : (8) =&amp;gt; 8,00 zł
Select end 8,00 zł
8,00 zł
Select begin
Where begin
 predicate i =&amp;gt; ((i &amp;gt; 5) &amp;amp;&amp;amp; ((i % 2) = 0)) : (9) =&amp;gt; False
 predicate i =&amp;gt; ((i &amp;gt; 5) &amp;amp;&amp;amp; ((i % 2) = 0)) : (10) =&amp;gt; True
Where end 10
 selector i =&amp;gt; i.ToString(&lt;span style="color: #006080"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;) : (10) =&amp;gt; 10,00 zł
Select end 10,00 zł
10,00 zł
Select begin
Where begin
 predicate i =&amp;gt; ((i &amp;gt; 5) &amp;amp;&amp;amp; ((i % 2) = 0)) : (11) =&amp;gt; False
Where end (no result)
Select end (no result)&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This text shows how the query has been executed. There can find there information about enumerators object creation, about data passing from one enumerator to another and execution of all functions used inside the query. One thing worth mentioning is that everything is presented in the same order as it was executed. Having this information we can easily figure out for example in which iteration the exception has been thrown and what were the values processing by the query at that moment. If such text representation is hard to read for you I also provide the VS visualizer for ExecutionPlan type presenting the same information on the tree control (copy LinqDebugger.dll and LinqDebugger.Visualizer.dll files to C:\Program Files\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\Visualizers folder to make it available).&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var executionPlan = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ExecutionPlan();

var q =
    from i &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; Enumerable.Range(0, 12).AsDebuggable(executionPlan)
    &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; i &amp;gt; 5 &amp;amp;&amp;amp; i % 2 == 0
    select i.ToString(&lt;span style="color: #006080"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;);

&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var s &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; q)
    Console.WriteLine(s);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_o4bEwho21rA/TMU-emxy1fI/AAAAAAAAAHQ/yz_Iy4C97C8/s1600-h/image4%5B1%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_o4bEwho21rA/TMU-fA4Qc7I/AAAAAAAAAHU/UOSfmPIfuWA/image_thumb2.png?imgmax=800" width="534" height="437" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am not going to describe here in details how LinqDebugger has been implemented, you can download the code and check this out yourself. As a hint I will just show you the signature of AsDebuggable method. Please notice what else you can pass to that method. We can choose which operators we want to trace using LinqOperators enum type or pass TextWriter object (Console.Out is set as a default TextWriter).&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; LinqDebuggerExtensions
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IQueryable&amp;lt;T&amp;gt; AsDebuggable&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt; source, ExecutionPlan executionPlan,
        LinqOperators linqOperators, TextWriter textWriter)
    { ... }
}

[Flags]
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;enum&lt;/span&gt; LinqOperators : &lt;span style="color: #0000ff"&gt;long&lt;/span&gt;
{
    None = 0,
    Aggregate = 1,
    All = 2,
    Any = 4,
    AsQueryable = 8,
    Average = 16,
    Cast = 32,
    Concat = 64,
    Contains = 128,
    ...
}

[Serializable]
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ExecutionPlan
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Expression Query { get; &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; List&amp;lt;Record&amp;gt; Records { get; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Reset();
}
    
[Serializable]
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Record
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; RecordType RecordType { get; &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; MethodCallExpression OperatorCallExpression { get; &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; Result { get; &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; LambdaExpression FuncCallExpression { get; &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; FuncCallName { get; &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;[] Arguments { get; &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; set; }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Tracing similar information during Rx queries execution is even more useful because in most cases such queries are executed asynchronously so debugging them is really hard. Let’s debug Rx version of previous query using &lt;strong&gt;RxDebugger&lt;/strong&gt;:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var q =
    from i &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; Enumerable.Range(0, 12).ToObservable().AsDebuggable(
        &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DebugSettings {SourceName = &lt;span style="color: #006080"&gt;&amp;quot;range&amp;quot;&lt;/span&gt;, Logger = DebugSettings.ConsoleLogger})
    &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; i &amp;gt; 5 &amp;amp;&amp;amp; i % 2 == 0
    select i.ToString(&lt;span style="color: #006080"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;);

q.Run(Console.WriteLine);


range.Where.Select.Subscribe()
range.Where.Subscribe()
range.Subscribe()
range.OnNext(0)
range.OnNext(1)
range.OnNext(2)
range.OnNext(3)
range.OnNext(4)
range.OnNext(5)
6,00 zł
range.OnNext(6)
range.Where.OnNext(6)
range.Where.Select.OnNext(6,00 zł)
range.OnNext(7)
8,00 zł
range.OnNext(8)
range.Where.OnNext(8)
range.Where.Select.OnNext(8,00 zł)
range.OnNext(9)
10,00 zł
range.OnNext(10)
range.Where.OnNext(10)
range.Where.Select.OnNext(10,00 zł)
range.OnNext(11)
range.OnCompleted()
range.Where.OnCompleted()
range.Where.Select.OnCompleted()
range.Where.Select.Dispose()
range.Where.Dispose()
range.Dispose()&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;As you can see this time a quite deferent information displayed on the screen and there is no VS visualizer available. It’s because the implementation of RxDebugger is totally different from LinqDebugger. But there are some additional features too. To understand how RxDebugger works I will show you the Debug method which gives us ability to trace single observable object instead of the whole Rx query.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var q =
    from i &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; Enumerable.Range(0, 12).ToObservable().Debug(
        &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DebugSettings {SourceName = &lt;span style="color: #006080"&gt;&amp;quot;range&amp;quot;&lt;/span&gt;, Logger = DebugSettings.ConsoleLogger})
    &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; i &amp;gt; 5 &amp;amp;&amp;amp; i % 2 == 0
    select i.ToString(&lt;span style="color: #006080"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;);

q.Run(Console.WriteLine);

range.Subscribe()
range.OnNext(0)
range.OnNext(1)
range.OnNext(2)
range.OnNext(3)
range.OnNext(4)
range.OnNext(5)
6,00 zł
range.OnNext(6)
range.OnNext(7)
8,00 zł
range.OnNext(8)
range.OnNext(9)
10,00 zł
range.OnNext(10)
range.OnNext(11)
range.OnCompleted()
range.Dispose()&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IObservable&amp;lt;T&amp;gt; Debug&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IObservable&amp;lt;T&amp;gt; source, DebugSettings settings, Func&amp;lt;T, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; valueSelector)
{
    Action&amp;lt;T&amp;gt; onNext = v =&amp;gt; { };
    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ((settings.NotificationFilter &amp;amp; NotificationFilter.OnNext) == NotificationFilter.OnNext)
        onNext = v =&amp;gt; 
        { 
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (settings.Logger != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) 
                settings.LoggerScheduler.Schedule(() =&amp;gt; settings.Logger(DebugEntry.Create(settings, NotificationFilter.OnNext, valueSelector(v)))); 
        };
        
    Action&amp;lt;Exception&amp;gt; onError = ... ;
    Action onCompleted = ... ;
    Action subscribe = ... ;
    Action dispose = ... ;
    
    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Observable.CreateWithDisposable&amp;lt;T&amp;gt;(o =&amp;gt;
    {
        var newObserver = Observer.Create&amp;lt;T&amp;gt;
        (
            v =&amp;gt; { onNext(v); o.OnNext(v); },
            e =&amp;gt; { onError(e); o.OnError(e); },
            () =&amp;gt; { onCompleted(); o.OnCompleted(); }
        );

        subscribe();
        var disposable = source.Subscribe(newObserver);

        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Disposable.Create(() =&amp;gt;
        {
            dispose();
            disposable.Dispose();
        });
    });
}

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DebugSettings
{
    &lt;span style="color: #008000"&gt;// defaults &lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Action&amp;lt;DebugEntry&amp;gt; DefaultLogger { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IScheduler DefaultLoggerSchduler { get; set; }       
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; DefaultMessageFormat { get; set; }

    &lt;span style="color: #008000"&gt;//loggers&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Action&amp;lt;DebugEntry&amp;gt; ConsoleLogger { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Action&amp;lt;DebugEntry&amp;gt; DebugLogger { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set; }
   
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; MessageFormat { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Action&amp;lt;DebugEntry&amp;gt; Logger { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IScheduler LoggerScheduler { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; SourceName { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; NotificationFilter NotificationFilter { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; OperatorFilter OperatorFilter { get; set; }

    &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; DebugSettings()
    {
        ConsoleLogger = n =&amp;gt; Console.WriteLine(n.FormattedMessage);
        DebugLogger = n =&amp;gt; Debug.WriteLine(n.FormattedMessage);

        DefaultLogger = DebugLogger;
        DefaultLoggerSchduler = Scheduler.CurrentThread;
        DefaultMessageFormat = &lt;span style="color: #006080"&gt;&amp;quot;{0}.{1}({2})&amp;quot;&lt;/span&gt;;
    }

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; DebugSettings()
    {
        SourceName = &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;
        NotificationFilter = NotificationFilter.All;
        OperatorFilter = OperatorFilter.AllOperators;

        Logger = DefaultLogger;
        LoggerScheduler = DefaultLoggerSchduler;
        MessageFormat = DefaultMessageFormat;
    }
}

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DebugEntry
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; SourceName { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; FormattedMessage { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; NotificationFilter Kind { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Exception Exception { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; Value { get; set; }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Debug method creates a new observable object on the top of given observable sources. Each observer passed to this observable source is wrapped into a new observer tracing information about calling Subscribe, Dispose methods at the IObservable level and OnNext, OnError, OnCompleted methods at the IObserver level. We can provide filter on Rx operators (OperatorFilter enum type) or logged information (NotificationFilter enum type). In LinqDebugger project TextWiter class has been used to log information. Here we have much more flexible solution because we can pass delegate type responsible for storing logged information. RxDebugger provides standard loggers such as DebugSettings.ConsoleLogger or DebugSettings.DebugLogger but we can also set our own delegate type or even merge many different logger delegates. Such a scenario will be presented in further part of the post. Once we know how Debug method works let’s reveal the secret behind the AsDebuggable method.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; IDebuggedObservable&amp;lt;T&amp;gt; : IObservable&amp;lt;T&amp;gt;
{
    DebugSettings Settings { get; }
}
    
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; RxDebuggerExtensions
{    
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IDebuggedObservable&amp;lt;T&amp;gt; AsDebuggable&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IObservable&amp;lt;T&amp;gt; source, DebugSettings settings)
    {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DebuggedObservable&amp;lt;T&amp;gt;(source.Debug(settings), settings);
    }
        
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IDebuggedObservable&amp;lt;TSource&amp;gt; Where&amp;lt;TSource&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IDebuggedObservable&amp;lt;TSource&amp;gt; source , Func&amp;lt;TSource,&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; predicate)
    {
        var settings = source.Settings.Copy();
        settings.SourceName = settings.SourceName +  &lt;span style="color: #006080"&gt;&amp;quot;.Where&amp;quot;&lt;/span&gt;;
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DebuggedObservable&amp;lt;TSource&amp;gt;((source &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; IObservable&amp;lt;TSource&amp;gt;).Where&amp;lt;TSource&amp;gt;(predicate).Debug(settings), settings);
    }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IDebuggedObservable&amp;lt;TResult&amp;gt; Select&amp;lt;TSource,TResult&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IDebuggedObservable&amp;lt;TSource&amp;gt; source , Func&amp;lt;TSource,TResult&amp;gt; selector)
    {
        var settings = source.Settings.Copy();
        settings.SourceName = settings.SourceName +  &lt;span style="color: #006080"&gt;&amp;quot;.Select&amp;quot;&lt;/span&gt;;
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DebuggedObservable&amp;lt;TResult&amp;gt;((source &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; IObservable&amp;lt;TSource&amp;gt;).Select&amp;lt;TSource,TResult&amp;gt;(selector).Debug(settings), settings);
    } 
    ... 
    
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DebuggedObservable&amp;lt;T&amp;gt; : IDebuggedObservable&amp;lt;T&amp;gt;
    {
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; IObservable&amp;lt;T&amp;gt; _source;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; DebugSettings _settings;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; DebugSettings Settings { get { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _settings; } }

        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; DebuggedObservable(IObservable&amp;lt;T&amp;gt; source, DebugSettings settings)
        {
            _source = source;
            _settings = settings;
        }
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IDisposable Subscribe(IObserver&amp;lt;T&amp;gt; observer)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _source.Subscribe(observer);
        }            
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Of course I didn’t implement extension methods for all Rx operator manually, I wrote T4 template generating appropriate extension methods (currently 127 methods in .Net version and 125 methods in Silverlight version :) ). The best way to use RxDebugger in your projects is to add T4 template to the project you are working on and run template every time you change the version of Rx. It allows you to always be synchronized with Rx dlls. Finally let’s see how to use RxDebugger in Silverlight application.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x:Class&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Blog.SL.Post016.RxDebuggerTest&amp;quot;&lt;/span&gt;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt; 
    &lt;span style="color: #ff0000"&gt;xmlns:x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;
    &lt;span style="color: #ff0000"&gt;xmlns:d&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://schemas.microsoft.com/expression/blend/2008&amp;quot;&lt;/span&gt; 
    &lt;span style="color: #ff0000"&gt;xmlns:mc&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;&lt;/span&gt; 
    &lt;span style="color: #ff0000"&gt;mc:Ignorable&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;d&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;d:DesignWidth&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;640&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;d:DesignHeight&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;480&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x:Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;input&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x:Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;output&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ItemsControl&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x:Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;log&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; RxDebuggerTest : UserControl
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; RxDebuggerTest()
    {
        InitializeComponent();

        var entries = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ObservableCollection&amp;lt;DebugEntry&amp;gt;();
        log.ItemsSource = entries;

        var q = input
            .GetObservableTextChanged()
            .Select(e =&amp;gt; ((TextBox)e.Sender).Text)
            .AsDebuggable(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DebugSettings
                              {
                                  SourceName = &lt;span style="color: #006080"&gt;&amp;quot;textChanged&amp;quot;&lt;/span&gt;, 
                                  LoggerScheduler = Scheduler.Dispatcher, 
                                  Logger = DebugSettings.DebugLogger + entries.Add,                                      
                              })
            .Throttle(TimeSpan.FromSeconds(2))
            .Select(t =&amp;gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;(t.Reverse().ToArray()));

        q.ObserveOnDispatcher().Subscribe(t =&amp;gt; output.Text = t);
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_o4bEwho21rA/TMU-fuB4LtI/AAAAAAAAAHY/qUl5mzeQ7l0/s1600-h/image4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_o4bEwho21rA/TMU-gGR_PkI/AAAAAAAAAHc/iIQVWqukxNY/image_thumb1.png?imgmax=800" width="327" height="248" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that’s it for the post. I encourage you to download and play with the two simple tools I provided here. They can be very helpful in debugging LINQ quires or learning about the internals of LINQ and Rx. 
  &lt;br /&gt;&lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=14209"&gt;downlaod&lt;/a&gt; (Rx versions: .Net3.5 v1.0.2698.0 and SL3 v1.0.2698.0) Always check for newest version at the beginning of the post.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-4688297035455393910?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/4688297035455393910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=4688297035455393910' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/4688297035455393910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/4688297035455393910'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2010/10/debugging-reactive-framework-rxdebugger.html' title='Debugging Reactive Framework (RxDebugger) and Linq to objects (LinqDebugger)'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_o4bEwho21rA/TMU-fA4Qc7I/AAAAAAAAAHU/UOSfmPIfuWA/s72-c/image_thumb2.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-5437759333523950556</id><published>2010-07-05T01:04:00.001-07:00</published><updated>2010-07-05T01:04:49.550-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='TPL'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><title type='text'>After Virtual Study Conference 2010</title><content type='html'>&lt;p&gt;&lt;a href="http://conf2010.virtualstudy.pl/index.php?sub=home_en"&gt;VirtualStudy Conference 2010&lt;/a&gt; was the first edition of the virtual conference where all attendees as well as speakers have been remotely connected together via Live Meeting platform. This time I have been talking about reactive programming&amp;#160; as a general way of writing code. Here is the overview of my presentation:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Reactive Programming - a new paradigm of programming&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Nowadays more and more systems created by us work in the cloud. Client while connecting using WebService is performing certain operations. Remote calls have longer time of duration than local methods, so often we are forced to perform them asynchronously. .NET Framework provides mechanisms, such as threads, APM pattern (Asynchronous Programming Model) or EAP (Event-based Asynchronous Pattern.) But the problem arises, when we want to coordinate a number of simultaneous asynchronous requests. What will happen in a situation where one of the operations will be canceled, or there is an unexpected error? Code that supports such a scenario becomes unreadable, and thus - difficult in maintenance and testing. During this session we will be presenting several approaches to reactive programming, including Reactive Framework, TPL, asynchronous workflows in F # and AsyncEnumerator project.&lt;/p&gt;  &lt;p&gt;As usually code samples and slides are available &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=12939"&gt;here&lt;/a&gt; and you can watch the presentation &lt;a href="http://vimeo.com/12937473"&gt;here&lt;/a&gt;. Enjoy!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-5437759333523950556?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/5437759333523950556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=5437759333523950556' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/5437759333523950556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/5437759333523950556'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2010/07/after-virtual-study-conference-2010.html' title='After Virtual Study Conference 2010'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-4454510324513587738</id><published>2010-03-30T23:45:00.001-07:00</published><updated>2010-03-30T23:45:00.968-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='RxSandbox'/><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><title type='text'>After Rx Road show</title><content type='html'>&lt;p&gt;Last week I have finished Rx Road show. I have been giving presentations about Reactive Framework on four Polish .Net Users Groups: in &lt;a href="http://ms-groups.pl/wroc.net/20.spotkanie/default.aspx?InstanceID=1"&gt;Wroclaw&lt;/a&gt;, &lt;a href="http://ms-groups.pl/lodz/Lists/Kalendarz/DispForm.aspx?ID=57&amp;amp;Source=http%3A%2F%2Fms%2Dgroups%2Epl%2Flodz%2FLists%2FKalendarz%2Fcalendar%2Easpx"&gt;Lodz&lt;/a&gt;, &lt;a href="http://ms-groups.pl/kgd.net/55_spotkanie/pages/Prezentacje.aspx"&gt;Krakow&lt;/a&gt; and &lt;a href="http://ms-groups.pl/slaskagrupa/Lists/Kalendarium/DispForm.aspx?ID=46&amp;amp;Source=http%3A%2F%2Fms%2Dgroups%2Epl%2Fslaskagrupa%2FLists%2FKalendarium%2FAllItems%2Easpx"&gt;Chorzow&lt;/a&gt;. Thank you all for coming to my session and filling the evaluations, I hope you have learned something useful about Rx during the session. I have also good news for those of you who were interested in my presentation but for some reason couldn’t come, one of the presentation has been recorded and it is now available for download or watching live online &lt;a href="http://www.vimeo.com/10529774"&gt;here&lt;/a&gt;. Slides and all code samples can be download from &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=9524"&gt;here&lt;/a&gt;. Enjoy!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-4454510324513587738?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/4454510324513587738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=4454510324513587738' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/4454510324513587738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/4454510324513587738'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2010/03/after-rx-road-show.html' title='After Rx Road show'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-5259180189712034155</id><published>2010-03-08T13:46:00.001-08:00</published><updated>2011-05-06T06:12:04.507-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='RxSandbox'/><title type='text'>RxSandbox V1</title><content type='html'>&lt;p&gt;&lt;font color="#ff0000"&gt;[&lt;a href="http://mnajder.blogspot.com/2011/05/rx-projects-update.html"&gt;New version&lt;/a&gt; (2011.05.06)]&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;[RxSandbox downlaod has been upgraded to the newest version of Rx (Build 1.0.2677.0 08/27/2010).] &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=13718"&gt;download&lt;/a&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;[RxSandbox downlaod has been upgraded to the newest version of Rx (Build 1.0.2617.0 07/15/2010).] &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=13676"&gt;download&lt;/a&gt;       &lt;br /&gt;(Changes: solution converted to VS2010, Net 4.0; 56 operators, grouping operators on the tree control; zoom)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;[RxSandbox downlaod has been upgraded to the newest version of Rx (Build 1.0.2441.0 04/14/2010).] &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=10232"&gt;download&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;[RxSandbox downlaod has been upgraded to the newest version of Rx (Build 1.0.2350.0 03/15/2010).] &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=9324"&gt;download&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;I am really happy to announce that the new version of RxSandbox has been just released. &lt;a href="http://mnajder.blogspot.com/2009/11/rxsandbox.html"&gt;Last time&lt;/a&gt;&lt;u&gt; &lt;/u&gt;I have been writing about the concept and the main ideas behind the project. That was just a small prototype, the proof of concept. This release is much more mature, the user can test more standard Rx operators and the API has been changed a little bit, however the concept stated the same. &lt;/p&gt;  &lt;p&gt;These are the main new features:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Marble diagrams &lt;/li&gt;    &lt;li&gt;New powerful API &lt;/li&gt;    &lt;li&gt;Extensibility mechanism &lt;/li&gt;    &lt;li&gt;Description of Rx the operators taken from Rx documentation &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Lets start from the the end-user which is not necessary interested in writing any code. He just wants to experiment with Rx operators, check how they behave in specific scenarios. When we start RxSandbox application we will see the list of standard operators on the left hand side. Lets assume that we don’t know how Merge operator works. After double click on the Merge node the new tab will be displayed. We can find the short description of Merge operator taken from documentation provided by Rx installer, we can also find the code sample that can be tested interactively trough UI. Each input argument is presented as a simple automatically generated UI with one textbox where we can write input value, tree buttons and the history of the source. The output of the expression can be presented in two ways: by a simple list displaying the results (“Output” tab) or the marble diagrams drawn live during testing (‘Marble diagram – Live” tab). There is also one tab called “Marble diagram - Definition” showing the operator definition.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_o4bEwho21rA/S5VwMTywnvI/AAAAAAAAAEg/H8osSgs2-jk/s1600-h/image4%5B1%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_o4bEwho21rA/S5VwNVHeA4I/AAAAAAAAAEk/ACuZqP5WrEQ/image_thumb1.png?imgmax=800" width="524" height="405" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now lets see what the developer can do with RxSandbox. The most important class in Rx API is the ExpressionDefinition. It holds all necessary information describing tested expression such as name, description and sample code.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_o4bEwho21rA/S5VwN50w55I/AAAAAAAAAEo/5VMbrr7DdgM/s1600-h/image17.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_o4bEwho21rA/S5VwOYpf4NI/AAAAAAAAAEs/YDBvaqV6kg4/image_thumb9.png?imgmax=800" width="616" height="341" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;When we look inside RxSandbox project we will see that the definitions of all standard operators are very similar, for example the Merge operator is defined like this:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; ExpressionDefinition Merge()
{
    Expression&amp;lt;Func&amp;lt;IObservable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;, IObservable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;, IObservable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;,
        IObservable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; expression
            = (a, b, c) =&amp;gt; Observable.Merge(a, b, c);
    
    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ExpressionDefinition.Create(expression);
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This is all we need to write. Other things like operator’s name, description and the text of expression can be inferred from the Linq expression. Of course all these information can be set manually using appropriate Create method overload and ExpressionSettings class. All .Net types are supported as observable type, not only the System.String type like in this example. The only requirement is there must exist a &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverter(VS.71).aspx"&gt;TypeConverter&lt;/a&gt; for that type. Later in this post I’ll how implement TypeConverter for custom type and how to create ExpressionDefinition without using Linq expression but using the whole method with many statements. The second very important class in RxSandbox API is an ExpressionInstance class which is very useful in scenarios where we want to use some RxSandbox functionalities directly from code without any UI experience (for example during writing Unit Tests or recording marble diagram).&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;Expression&amp;lt;Func&amp;lt;IObservable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;, IObservable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;, IObservable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;,
   IObservable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; expression
       = (a, b, c) =&amp;gt; Observable.Merge(a, b, c);

ExpressionDefinition definition = ExpressionDefinition.Create(expression);

&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var instance = ExpressionInstance.Create(definition))
{
    ExpressionInstance instance = ExpressionInstance.Create(definition);

    &lt;span style="color: #008000"&gt;// using non-generic type 'ObservableSource'&lt;/span&gt;
    ObservableSource output1 = instance.Output;
    output1.ObservableStr.Subscribe(Console.WriteLine);

    &lt;span style="color: #008000"&gt;// using generic type 'ObservableSource&amp;lt;T&amp;gt;'&lt;/span&gt;
    ObservableOutput&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt; output2 = instance.Output &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; ObservableOutput&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;;
    output2.Observable.Subscribe(Console.WriteLine);

    instance[&lt;span style="color: #006080"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;].OnNext(&lt;span style="color: #006080"&gt;&amp;quot;one&amp;quot;&lt;/span&gt;);    &lt;span style="color: #008000"&gt;// using non-generic type 'ObservableInput'&lt;/span&gt;
    (instance[&lt;span style="color: #006080"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; ObservableInput&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;).OnNext(&lt;span style="color: #006080"&gt;&amp;quot;two&amp;quot;&lt;/span&gt;); &lt;span style="color: #008000"&gt;// using generic type&lt;/span&gt;
    instance[&lt;span style="color: #006080"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;].OnNext(&lt;span style="color: #006080"&gt;&amp;quot;tree&amp;quot;&lt;/span&gt;);
    instance[&lt;span style="color: #006080"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;].OnCompleted();
    instance[&lt;span style="color: #006080"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;].OnCompleted();
    instance[&lt;span style="color: #006080"&gt;&amp;quot;c&amp;quot;&lt;/span&gt;].OnCompleted();
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;When we add delay before sending each input signal we can very easily record sample marble diagram.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Extensions
{
    &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; OnNext2(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; ObservableInput input, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)
    {
        input.OnNext(&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;);
        Thread.Sleep(100);
    }
    &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; OnError2(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; ObservableInput input)
    {
        input.OnError(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Exception());
        Thread.Sleep(100);
    }
    &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; OnCompleted2(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; ObservableInput input)
    {
        input.OnCompleted();
        Thread.Sleep(100);
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Marble diagrams are described in a very simple object model.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_o4bEwho21rA/S5VwO4GLaaI/AAAAAAAAAEw/GgnAhmf2bFg/s1600-h/image12.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_o4bEwho21rA/S5VwPfbvNKI/AAAAAAAAAE0/YCCi0TxsoBw/image_thumb6.png?imgmax=800" width="544" height="222" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;This object model can be serialized to Xml format, for instance the code above creates fallowing marble diagram:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Diagram&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Input&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Marble&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;one&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Order&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Marble&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;two&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Order&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Marble&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Kind&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;OnCompleted&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Order&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;3&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Input&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Input&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Marble&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;tree&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Order&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Marble&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Kind&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;OnCompleted&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Order&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;4&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Input&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Input&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;c&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Marble&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Kind&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;OnCompleted&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Order&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;5&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Input&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Output&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Marble&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;one&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Order&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Marble&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;two&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Order&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Marble&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;tree&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Order&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Marble&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Kind&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;OnCompleted&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Order&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;5&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Output&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Diagram&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_o4bEwho21rA/S5VwP9CY6qI/AAAAAAAAAE4/kfO6kZPiWLA/s1600-h/image4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_o4bEwho21rA/S5VwQaFzRiI/AAAAAAAAAE8/-o3-BiH2Agw/image_thumb11.png?imgmax=800" width="349" height="142" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;As we can see single marble diagram have a very simple Xml representation and diagrams for all standard operators from RxSandbox are stored in Diagrams.xml file (this file path can be changed in the configuration files).&lt;/p&gt;

&lt;p&gt;Short description added to all standard operators extracted from Rx documentation Xml file is a next new feature of current release. Of course not all tested reactive expression are related to one particular operator so the description can be set manually (ExpressionSettings.Description property). When we want write a very complicated Linq expression or the expression is passed as delegate type to the ExpressionDefinition.Create method and we also want to provide description from particular Rx operator at the same time, we can do it indicating operator thought MethodInfo type (ExpressionSettings.Operator property).&lt;/p&gt;

&lt;p&gt;The last but not least new feature is the extensibility mechanism. When we want to write our custom reactive expression without changing anything inside RxSadbox project we can do it by implementing IExpressionProvider interface directly or by inheriting from an abstract class ExpressionAttributeBasedProvider and setting our assembly name in the configuration file (ExtensionsAssembly element). During startup process RxSandbox loads that assembly, analyzes it and finds all expression providers. &lt;a href="http://mnajder.blogspot.com/2009/08/incremental-find-with-reactive.html"&gt;Few weeks ago&lt;/a&gt; I have been writing about Incremental Find implemented using Rx, lets see how such a query can tested via RxSandbox. &lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;[AttributeUsage(AttributeTargets.Method,AllowMultiple = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;, Inherited = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)]
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ExpressionAttribute : Attribute { }

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; IExpressionProvider
{
    IEnumerable&amp;lt;ExpressionDefinition&amp;gt; GetExpressions();
}

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ExpressionAttributeBasedProvider : IExpressionProvider
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;ExpressionDefinition&amp;gt; GetExpressions()
    {
        var q =
            from m &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GetType().GetMethods()
            let attr = Attribute.GetCustomAttribute(m, &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(ExpressionAttribute)) 
                &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; ExpressionAttribute
            &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; attr != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;
            select m.Invoke(&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; ExpressionDefinition;
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; q.ToList();
    }
}

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; CustomExpressions : ExpressionAttributeBasedProvider
{
    [Expression]
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; ExpressionDefinition IncrementalSearch()
    {
        Func&amp;lt;IObservable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;, IObservable&amp;lt;Person&amp;gt;, IObservable&amp;lt;Person&amp;gt;&amp;gt; expression
                = (codeChanged, webServiceCall) =&amp;gt;
                      {
                        var q =
                            from code &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; codeChanged
                            from x &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; Observable.Return(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Unit())
                                .Delay(TimeSpan.FromSeconds(4)).TakeUntil(codeChanged)
                            from result &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; webServiceCall.TakeUntil(codeChanged)
                            select result;

                          &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; q;
                      };

        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ExpressionDefinition.Create(expression, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ExpressionSettings
           {
               Name = &lt;span style="color: #006080"&gt;&amp;quot;Incremental find&amp;quot;&lt;/span&gt;,
               Description = &lt;span style="color: #006080"&gt;@&amp;quot;Send the code of the person you are looking for, &amp;quot;&lt;/span&gt;
                    + &lt;span style="color: #006080"&gt;&amp;quot;after four seconds (if you don't send new code again) web service &amp;quot;&lt;/span&gt;
                    + &lt;span style="color: #006080"&gt;&amp;quot;will be called. The result won't be returned if new code is provided &amp;quot;&lt;/span&gt;
                    + &lt;span style="color: #006080"&gt;&amp;quot;in the meantime.&amp;quot;&lt;/span&gt;,                   
           });
    }
}

[TypeConverter(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(PersonConverter))]
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Person
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Code { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Name { get; set; }
}

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; PersonConverter : TypeConverter
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (sourceType == &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;))
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.CanConvertFrom(context, sourceType);
    }
    
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)
    {
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;value&lt;/span&gt; &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;)
        {
            &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[] v = ((&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;)&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;).Split(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;[] { &lt;span style="color: #006080"&gt;','&lt;/span&gt; });
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Person {Code = v[0], Name = v[1]};
        }
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.ConvertFrom(context, culture, &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;);
    }
    
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; ConvertTo(ITypeDescriptorContext context,
       CultureInfo culture, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, Type destinationType)
    {
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (destinationType == &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;))
        {
            var person = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; Person;
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; person.Code + &lt;span style="color: #006080"&gt;&amp;quot;,&amp;quot;&lt;/span&gt; + person.Name;
        }                
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.ConvertTo(context, culture, &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, destinationType);
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;So that’s it for this release of RxSandbox. I encourage you to play with it a little bit and let me know what you think.&lt;/p&gt;

&lt;p&gt;And that’s not the end of the project. In upcoming releases I plan to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;create Silverlight version with ability to write reactive expression directly in the web browser &lt;/li&gt;

  &lt;li&gt;add integration with MEF &lt;/li&gt;

  &lt;li&gt;add better look and feel experience &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here you can &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=9324"&gt;download&lt;/a&gt; sources and binaries&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-5259180189712034155?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/5259180189712034155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=5259180189712034155' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/5259180189712034155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/5259180189712034155'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2010/03/rxsandbox-v1.html' title='RxSandbox V1'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_o4bEwho21rA/S5VwNVHeA4I/AAAAAAAAAEk/ACuZqP5WrEQ/s72-c/image_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-3151855908267244836</id><published>2009-11-26T12:58:00.001-08:00</published><updated>2009-11-26T12:58:29.583-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><category scheme='http://www.blogger.com/atom/ns#' term='WF4'/><title type='text'>After Microsoft Technology Summit 2009</title><content type='html'>&lt;p&gt;I would like to thank all of the attendees who came to my session - "Workflow Foundation 4.0" on the &lt;a href="http://mts2009.pl/"&gt;MTS2009&lt;/a&gt; conference. Thanks for all evaluations and comments! The videos from the conference has just been published. &lt;a href="http://mts2009.pl/rejestracja/webcast.aspx?id=63"&gt;Here&lt;/a&gt; is my webcast presentation (polish version).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-3151855908267244836?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/3151855908267244836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=3151855908267244836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3151855908267244836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3151855908267244836'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2009/11/after-microsoft-technology-summit-2009.html' title='After Microsoft Technology Summit 2009'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-3254645056927765505</id><published>2009-11-26T06:44:00.001-08:00</published><updated>2010-03-16T00:07:37.350-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='RxSandbox'/><title type='text'>RxSandbox</title><content type='html'>&lt;p&gt;Rx is awesome :)&lt;/p&gt;  &lt;p&gt;I have just started a new project called RxSandbox. It will be a very simple application that help to understand how Rx works, how each operator is implemented. But lets start from the beginning. Few days ago I was playing with Rx operators such as Zip, Merge, Wait, etc. writing a very short chunk of code for each operator. I was wondering how do they work in details, if they cache the values from sources, when exactly is OnCompleted executed on the observers and so on. The code could look like this:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;a.Zip(b, (x, y) =&amp;gt; x + &lt;span style="color: #006080"&gt;&amp;quot; - &amp;quot;&lt;/span&gt; + y)&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I wanted to a and b be the implementation of IObservable&amp;lt;string&amp;gt;. But what is the easiest way to create the implementation for them? I just wanted to be focused on writing code using operators so I needed some infrastructure for creating sample observable data sources. The RxSandbox is the solution! When you write something like this:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;Expression&amp;lt;Func&amp;lt;ManualObservable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;, ManualObservable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;,
    IObservable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; zipExpression
        = (a, b) =&amp;gt; a.Zip(b, (x, y) =&amp;gt; x + &lt;span style="color: #006080"&gt;&amp;quot; - &amp;quot;&lt;/span&gt; + y);
        
Control control = RxExpressionVisualizer.CreateControl(zipExpression);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;RxSandbox will automatically generate testing UI control:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_o4bEwho21rA/Sw6UNH7FYSI/AAAAAAAAACo/Oco-BCzbbww/s1600-h/image3.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/_o4bEwho21rA/Sw6UOi-lEBI/AAAAAAAAACs/f5JMkfW1icg/image_thumb1.png?imgmax=800" width="428" height="255" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;In the code above ManualObservable means that the user can manually define the values sent to the expression by writing them in a text box. Other possible could be RandomObservable, IntervalObservable and there are many more options. The UI control will be different for each type of Observable source. The only reason why the Expression&amp;lt;Func&amp;lt;...&amp;gt;&amp;gt; type has been used here is that this allows us to display the body of expression, but of course this is just an option. In general, the test case is a method taking some Observable sources and returning observable collection. It can be some really complicated code snippet with many statements as well.&lt;/p&gt;

&lt;p&gt;Possible scenarios working with RxSanbox:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Run RxSandbox application, create new project in VS, write Rx expression, compile it, RxSandbox automatically&amp;#160; finds new version of dll file and loads it, you are ready to test it (it may be &lt;a href="http://msdn.microsoft.com/en-us/library/dd460648(VS.100).aspx"&gt;MEF&lt;/a&gt;, VS AddIn not just of stand along application) &lt;/li&gt;

  &lt;li&gt;Run RxSandbox, write your Rx expression inside RxSandbox, start testing it (the easy way to do this is to use &lt;a href="http://msdn.microsoft.com/en-us/library/system.activities.design.view.expressiontextbox(VS.100).aspx"&gt;ExpressionTextBox&lt;/a&gt; control from WF4.0 which allows us to write single VB expression and expose it as an Linq expression type) &lt;/li&gt;

  &lt;li&gt;Drawing marble diagrams live during testing and also presenting the definitions of the operators as marble diagrams (of course with pac-mans and hearts :) - ) &lt;/li&gt;

  &lt;li&gt;Supporting Silverlight version &lt;/li&gt;

  &lt;li&gt;Many many more....&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope you got the idea. &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=8410"&gt;Here&lt;/a&gt; you can find the first prototype.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-3254645056927765505?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/3254645056927765505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=3254645056927765505' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3254645056927765505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3254645056927765505'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2009/11/rxsandbox.html' title='RxSandbox'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_o4bEwho21rA/Sw6UOi-lEBI/AAAAAAAAACs/f5JMkfW1icg/s72-c/image_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-3761091733286784823</id><published>2009-11-20T05:26:00.001-08:00</published><updated>2009-11-20T05:26:32.739-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Puzzle'/><title type='text'>Puzzle</title><content type='html'>&lt;p&gt;What will be displayed on the screen when we write it (and why) ?&lt;/p&gt; &lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;Action&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt; a = Console.WriteLine;
var b = a;
var c = (a += Console.WriteLine);

a(&lt;span style="color: #006080"&gt;"Rx"&lt;/span&gt;);
b(&lt;span style="color: #006080"&gt;"rulez"&lt;/span&gt;);
c(&lt;span style="color: #006080"&gt;"!"&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hint: delegate type is:&lt;br&gt;- reference type&lt;br&gt;- immutable type&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-3761091733286784823?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/3761091733286784823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=3761091733286784823' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3761091733286784823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3761091733286784823'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2009/11/puzzle.html' title='Puzzle'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-1058404755458311537</id><published>2009-11-12T22:50:00.001-08:00</published><updated>2009-11-12T22:50:38.324-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='ExpressionTrees'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><title type='text'>Linq to ICollectionView</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Currently I'm working on the project written in Silverlight and I have encountered an interface called &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.icollectionview(VS.95).aspx"&gt;ICollectionView&lt;/a&gt; and its standard implementation &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.pagedcollectionview(VS.95).aspx"&gt;PagedCollectionView&lt;/a&gt;. In short, this components allow us to create the view of collection of items with filtering, grouping and sorting functionality. The idea behind this interface is very similar to &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.dataview.aspx"&gt;DataView&lt;/a&gt;/DataTable mechanism. DataTable is responsible for storing data and DataView is just an appropriately configured proxy (only filtering and sorting in this case) which can be bound to UI controls. Let's look at a very simple example:&lt;/p&gt; &lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Number
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Value { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Random { get; set; }

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Number[] GetAll()
    {
        var random = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Random();
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;
            (from n &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; Enumerable.Range(1,5)
             from m &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; Enumerable.Repeat(n, n)
             select &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Number {Value = n, Random = random.Next(10)}).ToArray();            
    }
}

&lt;span style="color: #008000"&gt;// Silverlight&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; LinqToICollectionView : UserControl
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; LinqToICollectionView()
    {
        Number[] numbers = Number.GetAll();

        Content = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StackPanel
        {
            Orientation = Orientation.Horizontal,
            Children =
            {
                &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DataGrid { ItemsSource = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PagedCollectionView(numbers).SetConfiguration()},
            }
        };
    }
}

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Configurator
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; ICollectionView SetConfiguration(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; ICollectionView view)
    {
        &lt;span style="color: #008000"&gt;// filtering&lt;/span&gt;
        view.Filter = (&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; o) =&amp;gt; ((Number)o).Value &amp;lt; 5;
        &lt;span style="color: #008000"&gt;// grouping&lt;/span&gt;
        view.GroupDescriptions.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PropertyGroupDescription(&lt;span style="color: #006080"&gt;"Value"&lt;/span&gt;));
        &lt;span style="color: #008000"&gt;// sorting&lt;/span&gt;
        view.SortDescriptions.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SortDescription(&lt;span style="color: #006080"&gt;"Value"&lt;/span&gt;, ListSortDirection.Descending));
        view.SortDescriptions.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SortDescription(&lt;span style="color: #006080"&gt;"Random"&lt;/span&gt;, ListSortDirection.Ascending));
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; view;
    }     
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_o4bEwho21rA/Sv0BumJMmdI/AAAAAAAAACg/reGHKQ0TugM/s1600-h/image4.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/_o4bEwho21rA/Sv0BvOL3_UI/AAAAAAAAACk/oG8sQRtAbqg/image_thumb1.png?imgmax=800" width="117" height="286"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;But wait a minute, we said ... filtering, ordering, grouping ? Let's use LINQ query to configure ICollectionView:&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Configurator
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; ICollectionView SetConfigurationWithLinq(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; ICollectionView view)
    {
        var q =
            from n &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; View&amp;lt;Number&amp;gt;()
            &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; n.Value &amp;lt; 5
            orderby n.Value descending, n.Random
            group n by n.Value;
        q.Apply(view);
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; view;
    }        
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The whole implementation consists of 3 simple classes: View&amp;lt;T&amp;gt;, OrderedView&amp;lt;T&amp;gt; and GroupedView&amp;lt;T&amp;gt;.&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; View&amp;lt;T&amp;gt;
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;GroupDescription&amp;gt; GroupDescriptions { get { ... } }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;SortDescription&amp;gt; SortDescriptions { get { ... } }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Func&amp;lt;T,&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; Filter { get { ... } }
    
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; View&amp;lt;T&amp;gt; Where(Func&amp;lt;T, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; func) { ... }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; SortedView&amp;lt;T&amp;gt; OrderBy&amp;lt;T2&amp;gt;(Expression&amp;lt;Func&amp;lt;T, T2&amp;gt;&amp;gt; func) { ... }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; SortedView&amp;lt;T&amp;gt; OrderByDescending&amp;lt;T2&amp;gt;(Expression&amp;lt;Func&amp;lt;T, T2&amp;gt;&amp;gt; func) { ... }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; GroupedView&amp;lt;T&amp;gt; GroupBy&amp;lt;T2&amp;gt;(Expression&amp;lt;Func&amp;lt;T, T2&amp;gt;&amp;gt; func) { ... }
    
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Apply(ICollectionView collectionView) { ... }
}
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; SortedView&amp;lt;T&amp;gt; : View&amp;lt;T&amp;gt;
{    
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; SortedView&amp;lt;T&amp;gt; ThenBy&amp;lt;T2&amp;gt;(Expression&amp;lt;Func&amp;lt;T, T2&amp;gt;&amp;gt; func) { ... }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; SortedView&amp;lt;T&amp;gt; ThenByDescending&amp;lt;T2&amp;gt;(Expression&amp;lt;Func&amp;lt;T, T2&amp;gt;&amp;gt; func)  { ... }
}
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; GroupedView&amp;lt;T&amp;gt; : View&amp;lt;T&amp;gt;
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; GroupedView&amp;lt;T&amp;gt; ThenBy&amp;lt;T2&amp;gt;(Expression&amp;lt;Func&amp;lt;T, T2&amp;gt;&amp;gt; func) { ... }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Methods for sorting and grouping which take an expression tree as a parameter analyze the tree looking for indicated members (fields or properties) and collect appropriate SortDescription and GroupDescription objects. &lt;strong&gt;Where&lt;/strong&gt; method takes a delegate type which is combined via logical &lt;strong&gt;and&lt;/strong&gt; operator with existing filter delegate set previously (in case when Where method is called many times). Of course the same mechanism work also in WPF.&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;Number[] numbers = Number.GetAll();

&lt;span style="color: #008000"&gt;// WPF&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Window
{
    Content = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StackPanel
    {
        Orientation = Orientation.Horizontal,
        Children =
        {
            CreateListView(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CollectionViewSource { Source = numbers }.View.SetConfiguration()),
            CreateListView(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CollectionViewSource { Source = numbers }.View.SetConfigurationWithLinq())
        }
    }
}
.ShowDialog();


&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; ListView CreateListView(ICollectionView view)
{
    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ListView
    {
        GroupStyle = { GroupStyle.Default },
        View = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; GridView
        {
            Columns =
            {
                &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; GridViewColumn { Header = &lt;span style="color: #006080"&gt;"Value"&lt;/span&gt;, DisplayMemberBinding = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Binding(&lt;span style="color: #006080"&gt;"Value"&lt;/span&gt;) },
                &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; GridViewColumn { Header = &lt;span style="color: #006080"&gt;"Random"&lt;/span&gt;, DisplayMemberBinding = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Binding(&lt;span style="color: #006080"&gt;"Random"&lt;/span&gt;) },
            }
        },
        ItemsSource = view
    };
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;At the end I'd like to mention one interesting thing. We only support filtering, sorting and grouping and don't support for instance projection, joining and so on. That's way this code should compile:&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var v1 = &lt;span style="color: #008000"&gt;// only filtering specified&lt;/span&gt;
    from n &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; View&amp;lt;Number&amp;gt;() 
    &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; n.Value &amp;lt; 5 
    select n;

var v2 = &lt;span style="color: #008000"&gt;// grouping (last grouping definition overrides previous ones)&lt;/span&gt;
    from n &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; View&amp;lt;Number&amp;gt;()
    group n by n.Random into s 
    group s by s.Value;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;but this will not:&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var v3 = &lt;span style="color: #008000"&gt;// joining is not supported&lt;/span&gt;
    from p &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; View&amp;lt;Number&amp;gt;()
    join pp &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt;[] { 1, 2, 3, 4 } on p.Random equals pp
    select p;

var v4 = &lt;span style="color: #008000"&gt;// projection is not supported&lt;/span&gt;
    from p &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; View&amp;lt;Number&amp;gt;()
    &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; p.Value &amp;gt; 5
    select p.Random;

var v5 = &lt;span style="color: #008000"&gt;// at least one filtering, grouping or sorting definition must be specified&lt;/span&gt;
    from p &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; View&amp;lt;Number&amp;gt;()
    select p;

var v6 = &lt;span style="color: #008000"&gt;// Numer type is the only valid type of grouped element&lt;/span&gt;
    from p &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; View&amp;lt;Number&amp;gt;()
    group p.Random by p.Value;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As a homework I leave you a question: why it works this way ? :)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=8219"&gt;Sources&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-1058404755458311537?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/1058404755458311537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=1058404755458311537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/1058404755458311537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/1058404755458311537'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2009/11/linq-to-icollectionview.html' title='Linq to ICollectionView'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_o4bEwho21rA/Sv0BvOL3_UI/AAAAAAAAACk/oG8sQRtAbqg/s72-c/image_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-3118850993319238613</id><published>2009-08-30T12:03:00.001-07:00</published><updated>2009-08-30T12:03:38.425-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><title type='text'>Incremental find with Reactive Framework</title><content type='html'>&lt;p&gt;This time we will implement "incremental find" using Reactive Framework. This is a very good example showing what the Rx is all about.&lt;/p&gt; &lt;p&gt;Lets say we have a Windows Forms application with a single TextBox. When the user stops typing, the application immediately sends the request to the remote web service to find all words that containt the text from the TextBox. We use Rx to handle two important issues:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;how to find the moment when user has just stopped typing ?  &lt;li&gt;how to ensure that the correct results will be displayed when calling web service is implemented as asynchronous operation (results for the most recent input should discard responses for all previous requests) ?&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;For the sake of simplicity we simulate calling a web service by a simple asynchronous operation returning results after 3 or 6 seconds. This allows us to easily check whether the correct results are displayed every time. Just type 'iobserv' then wait for about 2 seconds (user stopped writing) and append letter 'e'. After about 3 second the results for 'ibserve' text should be displayed and then never changed.&lt;/p&gt; &lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; RxOverview =
&lt;span style="color: #006080"&gt;@"
http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Brian-Beckman-and-Erik-Meijer-Inside-the-NET-Reactive-Framework-Rx/

Now, what is Rx?

The .NET Reactive Framework (Rx) is the mathematical dual of LINQ to Objects. It consists of a pair 
of interfaces IObserver / IObservable that represent push-based, or observable, collections, plus a 
library of extension methods that implement the LINQ Standard Query Operators and other useful 
stream transformation functions.
... 
Observable collections capture the essence of the well-known subject/observer design pattern, and 
are tremendously useful for dealing with event-based and asynchronous programming, i.e. AJAX-style 
applications. For example, here is the prototypical Dictionary Suggest written using LINQ query 
comprehensions over observable collections:

IObservable&amp;lt;Html&amp;gt; q = from fragment in textBox
               from definitions in Dictionary.Lookup(fragment, 10).Until(textBox)
               select definitions.FormatAsHtml();

q.Subscribe(suggestions =&amp;gt; { div.InnerHtml = suggestions; })
"&lt;/span&gt;;

var textBox = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TextBox();
var label = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Label
                {
                    Text = &lt;span style="color: #006080"&gt;"results..."&lt;/span&gt;,
                    Location = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Point(0, 40),
                    Size = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Size(300, 500),
                    BorderStyle = BorderStyle.FixedSingle,                                
                };
var form = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Form { Controls = { textBox, label } };

Func&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, IObservable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[]&amp;gt;&amp;gt; search = (s) =&amp;gt;
{
    var subject = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Subject&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[]&amp;gt;();

    ThreadPool.QueueUserWorkItem((w) =&amp;gt;
    {
        Thread.Sleep(s.Length % 2 == 0 ? 3000 : 6000);

        var result = RxOverview.
            Split(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;[] { &lt;span style="color: #006080"&gt;" "&lt;/span&gt;, &lt;span style="color: #006080"&gt;"\n"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"\t"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"\r"&lt;/span&gt; }, StringSplitOptions.RemoveEmptyEntries).
            Where(t =&amp;gt; t.ToLower().Contains(s.ToLower())).
            ToArray();

        subject.OnNext(result);
        subject.OnCompleted();
    }, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);

    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; subject;
};

IObservable&amp;lt;Event&amp;lt;EventArgs&amp;gt;&amp;gt; textChanged = textBox.GetObservableTextChanged();

var q =
    from e &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; textChanged
    let text = (e.Sender &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; TextBox).Text
    from x &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; Observable.Return(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Unit()).Delay(1000).Until(textChanged)  &lt;span style="color: #008000"&gt;// first issue&lt;/span&gt;
    from results &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; search(text).Until(textChanged)                         &lt;span style="color: #008000"&gt;// second issue&lt;/span&gt;
    select &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; { text, results };

var a1 = q.Send(SynchronizationContext.Current).Subscribe(r =&amp;gt;
{
    label.Text = &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;" Text: {0}\n Found: {1}\n Results:\n{2}"&lt;/span&gt;,
        r.text,
        r.results.Length,
        &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Join(&lt;span style="color: #006080"&gt;"\n"&lt;/span&gt;, r.results));
});


form.ShowDialog();
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now try to implement the same functionality without the Rx Framework. 
&lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=7069"&gt;Sources&lt;/a&gt;&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 .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-3118850993319238613?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/3118850993319238613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=3118850993319238613' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3118850993319238613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3118850993319238613'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2009/08/incremental-find-with-reactive.html' title='Incremental find with Reactive Framework'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-8091778201499343740</id><published>2009-08-30T11:49:00.001-07:00</published><updated>2009-08-30T12:04:50.424-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><title type='text'>"Drag and drop" with Reactive Framework</title><content type='html'>&lt;p&gt;Just look how easily we can implement "drag and drop" functionality using Reactive Framework.&lt;/p&gt; &lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var form = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Form
{
    Controls =
       {
           &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Label {Text = &lt;span style="color: #006080"&gt;"label1"&lt;/span&gt;, BorderStyle = BorderStyle.FixedSingle},                       
           &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Button {Text = &lt;span style="color: #006080"&gt;"button1"&lt;/span&gt;},
           &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Label {Text = &lt;span style="color: #006080"&gt;"label2"&lt;/span&gt;, BorderStyle = BorderStyle.FixedSingle},
       }
};

Func&amp;lt;Control, IObservable&amp;lt;Event&amp;lt;MouseEventArgs&amp;gt;&amp;gt;&amp;gt; mouseDown = c =&amp;gt; c.GetObservableMouseDown();
Func&amp;lt;Control, IObservable&amp;lt;Event&amp;lt;MouseEventArgs&amp;gt;&amp;gt;&amp;gt; mouseUp = c =&amp;gt; c.GetObservableMouseUp();
Func&amp;lt;Control, IObservable&amp;lt;Event&amp;lt;MouseEventArgs&amp;gt;&amp;gt;&amp;gt; mouseMove = c =&amp;gt; c.GetObservableMouseMove();

var q =
    from Control con &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; form.Controls
    select
    (
        from d &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; mouseDown(con)
        from u &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; mouseMove(con).Until(mouseUp(con))
        select u
    );

q.Merge().Subscribe(args =&amp;gt;
{
    var control = args.Sender &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; Control;
    control.Location = Point.Add(control.Location,
        &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Size(args.EventArgs.X, args.EventArgs.Y));
});

form.ShowDialog();&lt;/pre&gt;Now all controls on the form can be moved from one place to another :) &lt;/div&gt;
&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_o4bEwho21rA/SprJs2Q4ImI/AAAAAAAAACA/hEos6bSqLJo/s1600-h/drag_drop3.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="drag_drop" src="http://lh5.ggpht.com/_o4bEwho21rA/SprJtndkVOI/AAAAAAAAACE/n3UnEG5noDs/drag_drop_thumb1.png?imgmax=800" width="272" height="193"&gt;&lt;/a&gt;&amp;nbsp;&lt;br&gt;&lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=7068"&gt;Sources&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-8091778201499343740?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/8091778201499343740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=8091778201499343740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/8091778201499343740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/8091778201499343740'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2009/08/and-drop-with-reactive-framework.html' title='&amp;quot;Drag and drop&amp;quot; with Reactive Framework'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_o4bEwho21rA/SprJtndkVOI/AAAAAAAAACE/n3UnEG5noDs/s72-c/drag_drop_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-3459630691540456028</id><published>2009-08-30T02:11:00.001-07:00</published><updated>2009-08-30T02:11:50.428-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><category scheme='http://www.blogger.com/atom/ns#' term='C#3.0'/><title type='text'>Inside LINQ queries</title><content type='html'>&lt;p&gt;This time we will dig a little bit deeper inside LINQ queries. We will see what C# 3.0 compiler is doing behind the scenes when it meets LINQ query in code and how we can use it. Lets look at simple LINQ query:&lt;/p&gt; &lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var q =
    from i &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt;[] {1, 2, 3, 4, 5, 6}
    &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; i &amp;lt; 5
    select i.ToString(&lt;span style="color: #006080"&gt;"C"&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Compiler handles LINQ query in two phases. Firstly it translates the query into a chain of method calls, each operator in LINQ syntax like where, select, ... is translated respectively into the methods Where, Select, ... .&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var q =
    &lt;span style="color: #0000ff"&gt;new&lt;/span&gt;[] {1, 2, 3, 4, 5, 6}.
    Where(i =&amp;gt; i &amp;lt; 5).
    Select(i =&amp;gt; i.ToString(&lt;span style="color: #006080"&gt;"C"&lt;/span&gt;));&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So operator &lt;em&gt;where&lt;/em&gt; was translated into &lt;em&gt;Where&lt;/em&gt; method and &lt;em&gt;select&lt;/em&gt; into &lt;em&gt;Select&lt;/em&gt; method. As you can see lambda expressions have been also generated and put as a methods' parameters. The second phase is a discovery phase. It's a phase of looking for the marching methods. In our sample the type "array of int" does not have any instance method named Where so compiler is analyzing suitable extensions methods. The closest extension method with matching parameters is defined in System.Linq.Enumerable class so this is the one that will be used. Where method is a generic method and in our case it returns IEnumerable&amp;lt;int&amp;gt; type. The implementation of Where method is quite simple and looks like this:&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Enumerable
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;TSource&amp;gt; Where&amp;lt;TSource&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;TSource&amp;gt; source,
        Func&amp;lt;TSource, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; predicate)
    {
        &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var i &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; source)
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(predicate(i))
                &lt;span style="color: #0000ff"&gt;yield&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; i;
    }        
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now the compiler is looking for Select method. Once again type IEnumerable&amp;lt;int&amp;gt; does not contain instance Select method but but an Enumerable class contains matching one. Finally, our query returns type IEnumerable&amp;lt;string&amp;gt; and the code builds succeeded because all necessary methods has been found. If you are interested how more complicated queries are translated and you are using ReSharper, just point your mouse over a LINQ query, press Alt + Enter and choose "Convert LINQ to methods chain" option. ReSharper will automatically generate method chain for you.&lt;/p&gt;
&lt;p&gt;Now we can see that LINQ query is just a chain of method calls, nothing more. The real power of LINQ is the implementation of these methods. .Net Framework 3.5 gives us Enumerable which contains about 50 methods with many different overloads such as Where, Select, Join, GoupBy, OrderBy, etc. Almost all methods extend IEnumerable&amp;lt;T&amp;gt; type so they can be used with all types implementing this interface, almost each collection in .Net Framework implementing this interface, which applies to almost all collections in the .NET Framework. I truly encourage you to familiarize with those methods because they are really powerful and only few of them are used in simple from ... where ... select LINQ queries.&lt;/p&gt;
&lt;p&gt;Once we know how LINQ queries are handled by C# compiler we are ready to do some tricky stuff. &lt;/p&gt;
&lt;p&gt;Lets say we would like to use the second overload of the Where method from Enumerable class inside LINQ query. This overload allows us to use the index of the iterated item and the the implementation looks like this:&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Enumerable
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;TSource&amp;gt; Where&amp;lt;TSource&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;TSource&amp;gt; source,
        Func&amp;lt;TSource, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; predicate)
    {
        &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; index = 0;
        &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var i &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; source)
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (predicate(i, index++))
                &lt;span style="color: #0000ff"&gt;yield&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; i;
    }    
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It means that we can write a condition based on the index of the items stored in queried sequence. Although we cannot extend syntax of the LINQ query but we can extend the IEnumerable&amp;lt;T&amp;gt; type with our own Where method implementation changing the second parameter's type.&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; EnhancedEnumerable
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt; Where&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt; collection,
        Func&amp;lt;T, Func&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; superPredicate)
    {
        &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; index = 0;
        &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var item &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; collection)
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (superPredicate(item).Invoke(index++))
                &lt;span style="color: #0000ff"&gt;yield&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; item;
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we are able to write a query based on the index of an item. 
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var q =
    from i &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt;[] { 1, 2, 3, 4, 5, 6 }
    &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; index  =&amp;gt; 
        {
            Console.WriteLine(&lt;span style="color: #006080"&gt;"{0}. {1}"&lt;/span&gt;, index, i);
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; (index % 2 == 0) &amp;amp;&amp;amp; (i &amp;lt; 5);
        }
    select i.ToString(&lt;span style="color: #006080"&gt;"C"&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Another interesting thing we can do with LINQ query is that we can provide a set of objects describing some domain with appropriate "LINQ methods" called Where, Select, OrderBy and so on, so that we could write LINQ query over them. This approach give us very strong control over LINQ query syntax because just during compile time we can chose witch LINQ operators we support and which we don't. Lets look at the example.&lt;/p&gt;
&lt;p&gt;Lets assume that we have a company and we have a simple application storing data about our employees. The data are stored in files on the disk, each employee is stored in separate file. Additionally files are grouped in folders by some common feature. For example employees working in particular department are placed in the same folder. Lets assume also that the main types describing our domain look like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_o4bEwho21rA/SppCDltzexI/AAAAAAAAAB4/rhA5hMoZFqc/s1600-h/Company12.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="Company" src="http://lh3.ggpht.com/_o4bEwho21rA/SppCPW8jlOI/AAAAAAAAAB8/ZQei5DnMHKM/Company_thumb8.png?imgmax=800" width="559" height="312"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Lets start with a simple LINQ query:&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;Company company= &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Company();
var q =
    from e &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; company
    select e.Name;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This code will not compile because compiler cannot find matching Select method so lets provide it.&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Company
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt; Select&amp;lt;T&amp;gt;(Func&amp;lt;Employee, T&amp;gt; p) { ... }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Is it worth to mention that variable e in our query is an instance of Employee type because matched Select method takes an Employee type as a first parameter of lambda expression. Now lets provider support for &lt;em&gt;where&lt;/em&gt; operator.&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var q =
    from e &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; company
    &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; e.Salary &amp;gt; 100
    select e.Name;

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Company
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Employee Where(Func&amp;lt;Employee, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt; p)) 
}

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Employee&amp;lt;T&amp;gt;
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;T2&amp;gt; Select&amp;lt;T2&amp;gt;(Func&amp;lt;T, T2&amp;gt; p) { ... }
}

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Employee : Employee&amp;lt;Employee&amp;gt; { }&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As you can see this is a very powerful mechanism which gives us ability to provide only those operators that are supported in our "query language". We could say that it is an alternative mechanism to writing a custom LINQ provider when we want to integrate LINQ queries with our specific domain. LINQ provider is much more flexible during process of analyzing and execution of queries but this approach has one very important feature. We can choose which operators we provide and what parameters the particular operator can take. Our query is validated at compile time, which means that if we don't support for instance &lt;em&gt;sort&lt;/em&gt; operator and some query contains that operator, compilation will fail with error "SortBy method can not be found". When writing custom LINQ provider we have to validate LINQ query at runtime ourselves. To make this clear see next queries.&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var q =
    from Manager m &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; company
    select m.ManagedProjects;
    
&lt;span style="color: #008000"&gt;// this query is translated into: q = company.Cast&amp;lt;Manager&amp;gt;().Select(m =&amp;gt; m.ManagedProjects);&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Company
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; T Cast&amp;lt;T&amp;gt;() &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : ICast { ... }
}

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; ICast
{ }
    
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Developer : Employee&amp;lt;Developer&amp;gt;, ICast { }
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Manager : Employee&amp;lt;Manager&amp;gt;, ICast { }&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We provide Cast operator for the Company type so we can use Developer or Manager type in &lt;em&gt;from &lt;/em&gt;clause (if fact each type implementing ICast). Please notice that the type of variable m is Manager not Employee in our query. Next query will show even more interesting feature.&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var q =
   from e &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; company
   &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; e.Salary &amp;gt; 100     
   &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; e.IsManager
   &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; e.ManagedProjects &amp;gt; 1
   select &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; { e.Name, e.ManagedProjects };
   
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Employee
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Manager IsManager { get { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;; } }

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Manager Where(Func&amp;lt;Employee, Manager&amp;gt; p) { ... }
}  &lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here the type of variable e in the first part of the query is Employee, but after line "where e.IsManager" the type of e is Manager. As we saw we may provide support for any subset of LINQ operators but that's not all. We can also provide the particular operator only for specified type, for example "only managers can be sorted" or "we can group employees only by Department or Localization":&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var q =
    from Manager m &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; company                  
    orderby m.ManagedProjects descending, m.Name
    select &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; { m.Name, m.ManagedProjects };

&lt;span style="color: #008000"&gt;// q = company.Cast&amp;lt;Manager&amp;gt;().&lt;/span&gt;
&lt;span style="color: #008000"&gt;//    OrderByDescending(m =&amp;gt; m.ManagedProjects).ThenBy(m =&amp;gt; m.Name).&lt;/span&gt;
&lt;span style="color: #008000"&gt;//    Select(m =&amp;gt; new {m.Name, m.ManagedProjects});&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Manager
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Manager OrderBy&amp;lt;T&amp;gt;(Func&amp;lt;Manager, T&amp;gt; p) { ... }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Manager OrderByDescending&amp;lt;T&amp;gt;(Func&amp;lt;Manager, T&amp;gt; p) { ... }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Manager ThenBy&amp;lt;T&amp;gt;(Func&amp;lt;Manager, T&amp;gt; p) { ... }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Manager ThenByDescending&amp;lt;T&amp;gt;(Func&amp;lt;Manager, T&amp;gt; p) { ... }
}


var q =
    from Developer e &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; company
    group e by e.Location;
    
&lt;span style="color: #008000"&gt;// q = company.Cast&amp;lt;Developer&amp;gt;().GroupBy(e =&amp;gt; e.Location);&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Employee&amp;lt;T&amp;gt;    
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Location Location { get; &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Department Department { get; &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; set; }
    
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Group&amp;lt;Location,T&amp;gt;&amp;gt; GroupBy(Func&amp;lt;T, Location&amp;gt; p) { ... }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Group&amp;lt;Department, T&amp;gt;&amp;gt; GroupBy(Func&amp;lt;T, Department&amp;gt; p) { ... }
}  

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Group&amp;lt;TKey, T&amp;gt;
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; TKey Key { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set;}
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt; Items { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set;}
    
    &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; Group(TKey key, IEnumerable&amp;lt;T&amp;gt; items)
    {
        Key = key;
        Items = items;
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally I'd like to show you how smart the C# 3.0 compiler is. When compiler meets a LINQ query with a simple select operator like this:&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var q =
    from i &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt;[] {1, 2, 3, 4, 5, 6}
    &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; i &amp;lt; 5
    select i;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The small small optimization takes place. Because our query after translation looks like this:&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var q =
    &lt;span style="color: #0000ff"&gt;new&lt;/span&gt;[] {1, 2, 3, 4, 5, 6}.
    Where(i =&amp;gt; i &amp;lt; 5).
    Select(i =&amp;gt; i);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;so probably calling Select method does not change anything (converting i into i) so this call is not generated and the final code looks like this:&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var q =
    &lt;span style="color: #0000ff"&gt;new&lt;/span&gt;[] {1, 2, 3, 4, 5, 6}.
    Where(i =&amp;gt; i &amp;lt; 5);  &lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And of course in this particular case (LINQ to objects) it is true. But if we provide our own Select method returning DateTime type and if we place EnhancedEnumerable class "closer" to the above query (for instance in the same namespace) then our method will be used instead of standard LINQ operator (System.Linq.Enumerable.&lt;em&gt;Where&lt;/em&gt;).&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; EnhancedEnumerable
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; DateTime Select&amp;lt;TSource, TResult&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IEnumerable&amp;lt;TSource&amp;gt; source,
        Func&amp;lt;TSource, TResult&amp;gt; predicate)
    {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; DateTime.Now;
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In such case will the optimization take place or not ? Yes, it will. The optimization is performed in the first phase of query translation when we don't know yet which Select method will be used or even if any exits. There are more such optimizations so we should be careful when writing more advanced queries.&lt;/p&gt;
&lt;p&gt;Treat this post as a prerequisite for next few posts where we will be talking more about LINQ internals.&lt;/p&gt;
&lt;p&gt;The whole "queryable" solution with classes: Company, Employee, Developer and so on can be downloaded from &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=7066"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-3459630691540456028?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/3459630691540456028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=3459630691540456028' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3459630691540456028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/3459630691540456028'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2009/08/inside-linq-queries.html' title='Inside LINQ queries'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_o4bEwho21rA/SppCPW8jlOI/AAAAAAAAAB8/ZQei5DnMHKM/s72-c/Company_thumb8.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-4871518395601222391</id><published>2009-08-15T02:16:00.001-07:00</published><updated>2011-05-06T06:36:49.048-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='T4'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><title type='text'>Generating observable events with T4 template for Reactive Framework</title><content type='html'>&lt;p&gt;&lt;font color="#ff0000"&gt;[&lt;a href="http://mnajder.blogspot.com/2011/05/rx-projects-update.html"&gt;New version&lt;/a&gt; (2011.05.06)]&lt;/font&gt;&lt;/p&gt;&lt;p&gt;Reactive Framework (Rx) is what you definitely need to play with. Firstly watch &lt;a href="http://langnetsymposium.com/2009/talks/23-ErikMeijer-LiveLabsReactiveFramework.html"&gt;this&lt;/a&gt;, &lt;a href="http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Brian-Beckman-and-Erik-Meijer-Inside-the-NET-Reactive-Framework-Rx/"&gt;this&lt;/a&gt; and &lt;a href="http://channel9.msdn.com/shows/Going+Deep/Kim-Hamilton-and-Wes-Dyer-Inside-NET-Rx-and-IObservableIObserver-in-the-BCL-VS-2010/"&gt;this&lt;/a&gt;, then download &lt;a href="http://silverlight.codeplex.com/SourceControl/ListDownloadableCommits.aspx"&gt;Silverlight Toolkit&lt;/a&gt; where you can find System.Reactive.dll. If you don't want to use the Silverlight's version of Rx, convert it to the full .Net framework's version &lt;a href="http://evain.net/blog/articles/2009/07/30/rebasing-system-reactive-to-the-net-clr"&gt;this way&lt;/a&gt;. Next read &lt;a href="http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html"&gt;this&lt;/a&gt;, &lt;a href="http://themechanicalbride.blogspot.com/2009/07/developing-with-rx-part-1-extension.html"&gt;this&lt;/a&gt;, &lt;a href="http://themechanicalbride.blogspot.com/2009/07/developing-with-rx-part-2-converting.html"&gt;this&lt;/a&gt; and &lt;a href="http://themechanicalbride.blogspot.com/2009/08/joy-of-rx-building-asynchronous-service.html"&gt;this&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Now you are ready to write you own LINQ queries over events :) Lets see a very simple query listening to 3 event of the System.Windows.Forms.Form class.&lt;/p&gt; &lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;var form = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Form();

IObservable&amp;lt;Event&amp;lt;KeyEventArgs&amp;gt;&amp;gt; keyDown =
    Observable.FromEvent&amp;lt;KeyEventArgs&amp;gt;(form, &lt;span style="color: #006080"&gt;"KeyDown"&lt;/span&gt;);
IObservable&amp;lt;Event&amp;lt;KeyEventArgs&amp;gt;&amp;gt; keyUp =
    Observable.FromEvent&amp;lt;KeyEventArgs&amp;gt;(form, &lt;span style="color: #006080"&gt;"KeyUp"&lt;/span&gt;);
IObservable&amp;lt;Event&amp;lt;MouseEventArgs&amp;gt;&amp;gt; mouseMove =
    Observable.FromEvent&amp;lt;MouseEventArgs&amp;gt;(form, &lt;span style="color: #006080"&gt;"MouseMove"&lt;/span&gt;);

var downMoveUp =
    from key &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; keyDown
    from mouse &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; mouseMove.Until(keyUp)
    select &lt;span style="color: #006080"&gt;" X = "&lt;/span&gt; + mouse.EventArgs.X + &lt;span style="color: #006080"&gt;" Y = "&lt;/span&gt; + mouse.EventArgs.Y;

downMoveUp.Subscribe(x =&amp;gt; Console.WriteLine(x));

Console.WriteLine(&lt;span style="color: #006080"&gt;"Press any key and move mouse until key up ... "&lt;/span&gt;);

form.ShowDialog();&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When you create an event observer you need to put a hardcoded event name and appropriate event arguments type. This is quite uncomfortable, especially when you want to use this event in many different places so lets wrap this code into an extension methods.&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; FormExtenions
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IObservable&amp;lt;Event&amp;lt;KeyEventArgs&amp;gt;&amp;gt; GetObservableKeyDown(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; Form form)
    {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Observable.FromEvent&amp;lt;KeyEventArgs&amp;gt;(form, &lt;span style="color: #006080"&gt;"KeyDown"&lt;/span&gt;);
    }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IObservable&amp;lt;Event&amp;lt;KeyEventArgs&amp;gt;&amp;gt; GetObservableKeyUp(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; Form form)
    {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Observable.FromEvent&amp;lt;KeyEventArgs&amp;gt;(form, &lt;span style="color: #006080"&gt;"KeyUp"&lt;/span&gt;);
    }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IObservable&amp;lt;Event&amp;lt;MouseEventArgs&amp;gt;&amp;gt; GetObservableMouseMove(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; Form form)
    {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Observable.FromEvent&amp;lt;MouseEventArgs&amp;gt;(form, &lt;span style="color: #006080"&gt;"MouseMove"&lt;/span&gt;);
    }
}

var keyDown = form.GetObservableKeyDown();
var keyUp = form.GetObservableKeyUp();
var mouseMove = form.GetObservableMouseMove();&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Writing extension methods for all events of all controls is obviously a very boring and error-prone task so lets use &lt;a href="http://www.olegsych.com/2007/12/text-template-transformation-toolkit/"&gt;T4&lt;/a&gt; templates to generate that code.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_o4bEwho21rA/SoZ8yM-Z3TI/AAAAAAAAABU/bPAB3r9CTQk/s1600-h/ObservableEventsT413.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="415" alt="ObservableEventsT4" src="http://lh4.ggpht.com/_o4bEwho21rA/SoZ8zsM_j2I/AAAAAAAAABc/6nXDR9LspkU/ObservableEventsT4_thumb9.png?imgmax=800" width="635" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;This produces:&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;

&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; ObservableEvents
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ExtensionMethods
    {
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IObservable&amp;lt;Event&amp;lt;System.Windows.Forms.ControlEventArgs&amp;gt;&amp;gt; GetObservableControlAdded(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; System.Windows.Forms.Control source)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Observable.FromEvent&amp;lt;System.Windows.Forms.ControlEventArgs&amp;gt;(source,&lt;span style="color: #006080"&gt;"ControlAdded"&lt;/span&gt; );
        }
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IObservable&amp;lt;Event&amp;lt;System.Windows.Forms.ControlEventArgs&amp;gt;&amp;gt; GetObservableControlRemoved(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; System.Windows.Forms.Control source)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Observable.FromEvent&amp;lt;System.Windows.Forms.ControlEventArgs&amp;gt;(source,&lt;span style="color: #006080"&gt;"ControlRemoved"&lt;/span&gt; );
        }
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IObservable&amp;lt;Event&amp;lt;System.Windows.Forms.DragEventArgs&amp;gt;&amp;gt; GetObservableDragDrop(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; System.Windows.Forms.Control source)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Observable.FromEvent&amp;lt;System.Windows.Forms.DragEventArgs&amp;gt;(source,&lt;span style="color: #006080"&gt;"DragDrop"&lt;/span&gt; );
        }
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IObservable&amp;lt;Event&amp;lt;System.Windows.Forms.DragEventArgs&amp;gt;&amp;gt; GetObservableDragEnter(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; System.Windows.Forms.Control source)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Observable.FromEvent&amp;lt;System.Windows.Forms.DragEventArgs&amp;gt;(source,&lt;span style="color: #006080"&gt;"DragEnter"&lt;/span&gt; );
        }
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IObservable&amp;lt;Event&amp;lt;System.Windows.Forms.DragEventArgs&amp;gt;&amp;gt; GetObservableDragOver(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; System.Windows.Forms.Control source)
        {
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Observable.FromEvent&amp;lt;System.Windows.Forms.DragEventArgs&amp;gt;(source,&lt;span style="color: #006080"&gt;"DragOver"&lt;/span&gt; );
        }&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Templates work also in Silverlight's projects. Get source code for this post from &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=6952"&gt;here&lt;/a&gt; and enjoy the Rx!.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-4871518395601222391?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/4871518395601222391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=4871518395601222391' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/4871518395601222391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/4871518395601222391'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2009/08/generating-observable-events-with-t4.html' title='Generating observable events with T4 template for Reactive Framework'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_o4bEwho21rA/SoZ8zsM_j2I/AAAAAAAAABc/6nXDR9LspkU/s72-c/ObservableEventsT4_thumb9.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-6613038924453508221</id><published>2009-06-16T00:27:00.001-07:00</published><updated>2009-06-16T00:27:04.891-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><category scheme='http://www.blogger.com/atom/ns#' term='WF'/><category scheme='http://www.blogger.com/atom/ns#' term='WF4'/><title type='text'>Introduction to WF 4.0 (presentation)</title><content type='html'>&lt;p&gt;At the beginning of June I have been giving presentation about WF 4.0, &lt;a href="http://codecamp.pl/pl/PostConference.aspx"&gt;here&lt;/a&gt; you can find demos and video.&lt;br&gt;I had the opportunity to take part in the "Deep Dive .Net 4.0 - WF/WCF" workshops in Redmond at the end of 2008. I think WF 4.0 will be a really hot technology&amp;nbsp; in the near feature so it's definitely worth to familiarize with it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-6613038924453508221?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/6613038924453508221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=6613038924453508221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/6613038924453508221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/6613038924453508221'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2009/06/introduction-to-wf-40-presentation.html' title='Introduction to WF 4.0 (presentation)'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-1673932135971978985</id><published>2009-01-20T13:06:00.001-08:00</published><updated>2009-01-20T13:06:13.663-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><category scheme='http://www.blogger.com/atom/ns#' term='C#3.0'/><title type='text'>C# 3.0 Internals (presentation)</title><content type='html'>&lt;p&gt;Few weeks ago I have been giving the presentation about C# 3.0 internals. &lt;a href="http://www.vimeo.com/2893818"&gt;Here&lt;/a&gt; you can find recording from that presentation. For English language readers unfortunately the presentation is entirely in Polish.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-1673932135971978985?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/1673932135971978985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=1673932135971978985' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/1673932135971978985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/1673932135971978985'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2009/01/c-30-internals-presentation.html' title='C# 3.0 Internals (presentation)'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-4677078571642230937</id><published>2008-11-08T15:17:00.000-08:00</published><updated>2008-11-08T15:55:53.450-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ExpressionTrees'/><category scheme='http://www.blogger.com/atom/ns#' term='C#3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='WF'/><title type='text'>Use expression tree to avoid string literals in reflecting code part 2 (WorkflowArguments, WorkflowOutputParameters, Mapper)</title><content type='html'>&lt;p&gt;&lt;a href="http://mnajder.blogspot.com/2008/11/use-expression-tree-to-avoid-string.html"&gt;Last time&lt;/a&gt; I was writing about a utility class called ReflectionHelper, this time I'll show you two real scenarios where this class or just expression tree have been used.&lt;/p&gt; &lt;p&gt;For last couple of months I've been working on a project built on the top of Workflow Foundation. Now we have C#3.0 many thinks can be done smarter, simpler, quicker, better or ... more cool ;) Let's look at a simple workflow class:&lt;/p&gt; &lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MyWorkflow : SequentialWorkflowActivity
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; MyInt { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; MyString { get; set; }            

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; MyWorkflow()
    {
        CodeActivity codeActivity = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CodeActivity(&lt;span style="color: #006080"&gt;"codeActivity1"&lt;/span&gt;);
        codeActivity.ExecuteCode += &lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt;
        {
            Console.WriteLine(&lt;span style="color: #006080"&gt;"MyInt : "&lt;/span&gt; + MyInt);                    
            Console.WriteLine(&lt;span style="color: #006080"&gt;"MyString : "&lt;/span&gt; + MyString);
            MyInt++;
            MyString = &lt;span style="color: #006080"&gt;"yo"&lt;/span&gt;;
        };
        Activities.Add(codeActivity);
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I know that not all of you had the opportunity to use WF so I'll try to give you some basics. The most elementary component in WF is an activity. We can say that activity is just a class with 'Excute' method responsible for doing some action. Workflow process is also an activity containg another activities which are executed one by one (that's why it derives from SequentialWorkflowActivity). Our workflow has only one activity CodeActivity which raises ExecuteCode event when it's executed. Additionally our process manipulates its state stored in properties MyInt and MyString. Let's see how to start this process and initialize its state:&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (WorkflowRuntime workflowRuntime = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; WorkflowRuntime())
{                
    var arguments = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;()
        {
            {&lt;span style="color: #006080"&gt;"MyString"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"hello"&lt;/span&gt;},
            {&lt;span style="color: #006080"&gt;"MyInt"&lt;/span&gt;, Math.Max(5, 10)},
        };

    WorkflowInstance instance = workflowRuntime.CreateWorkflow(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(MyWorkflow), arguments);
    instance.Start();
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The problem is that method CreateWorkflow takes a dictionary where the key is a property name and the value is a value of the property. But what if someone changes the name or the type of the property someday ? The code will compile fine but at runtime we will get an exception. Since we have C#3.0 we can very easily resolve these two problems.&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;var arguments = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; WorkflowArguments&amp;lt;MyWorkflow&amp;gt;()
{
    { w =&amp;gt; w.MyString, &lt;span style="color: #006080"&gt;"hello"&lt;/span&gt; },
    { w =&amp;gt; w.MyInt, Math.Max(5,10) }
};

WorkflowInstance instance = workflowRuntime.CreateWorkflow(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(MyWorkflow), arguments);

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; WorkflowArguments&amp;lt;TWorkflow&amp;gt; : Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;,&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; WorkflowArguments&amp;lt;TWorkflow&amp;gt; Add&amp;lt;T&amp;gt;(Expression&amp;lt;Func&amp;lt;TWorkflow, T&amp;gt;&amp;gt; property,
        T propertyValue)
    {
        var propertyInfo = Blog.Post002.ReflectionHelper.GetProperty&amp;lt;TWorkflow,T&amp;gt;(property);
        Add(propertyInfo.Name, propertyValue);
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;;
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The same technique we be used to process parameters after execution.&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; workflowRuntime_WorkflowCompleted(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, WorkflowCompletedEventArgs e)
{
    Console.WriteLine(&lt;span style="color: #006080"&gt;"workflowRuntime_WorkflowCompleted"&lt;/span&gt;);
    var parameters = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; WorkflowOutputParameters&amp;lt;MyWorkflow&amp;gt;(e.OutputParameters);

    Console.WriteLine(parameters.GetParameter( w =&amp;gt; w.MyInt));
    Console.WriteLine(parameters.GetParameter( w =&amp;gt; w.MyString));            
} 

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; WorkflowOutputParameters&amp;lt;TWorkflow&amp;gt; 
{           
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; Parameters { get; set; }
    
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; WorkflowOutputParameters(Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; parameters)
    {           
        Parameters = parameters;
    }

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; T GetParameter&amp;lt;T&amp;gt;(Expression&amp;lt;Func&amp;lt;TWorkflow, T&amp;gt;&amp;gt; property)
    {
        var propertyInfo = Blog.Post002.ReflectionHelper.GetProperty&amp;lt;TWorkflow, T&amp;gt;(property);
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; (T)Parameters[propertyInfo.Name];
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The second example is a Mapper class. It's a quite common scenario when we map instance of class A into instance of class B. For example, we very often load some kind of DAL entity from database into memory then we map it to some kind of business entity. In many cases the shape of both types if very similar, they have the same properties/fields so the mapping code is very simple. It just transfers values of properties or fields from one object to another. Mapper class is a very simple class giving us the ability to record the mapping of two types to each other. Next we can execute mapping process specifying two instances of those classes and the direction of mapping. Lets assume that we have two types:&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt; CustomerDal
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Id { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Name { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Age { get; set; }            
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;char&lt;/span&gt; Gender { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; City { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Street { get; set; }
}

&lt;span style="color: #0000ff"&gt;class&lt;/span&gt; CustomerBO
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Id { get; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; set;  }    &lt;span style="color: #008000"&gt;// only getter&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Name { get; set; }        &lt;span style="color: #008000"&gt;// exactly the same name&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; Age;                      &lt;span style="color: #008000"&gt;// field&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;char&lt;/span&gt; Sex { get; set; }           &lt;span style="color: #008000"&gt;// another name&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Address { get; set; }     &lt;span style="color: #008000"&gt;// more complicated mapping&lt;/span&gt;
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we want to map an instance of CustomerDal type to instance of CustomerBo. Firstly we need to define how the properties of types should be transformed. Once we have it we can start mapping.&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;var m1 = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Mapper&amp;lt;CustomerDal, CustomerBO&amp;gt;    &lt;span style="color: #008000"&gt;// A type, B type&lt;/span&gt;
  {
      {a =&amp;gt; a.Id, b =&amp;gt; b.Id, Direction.A2B},    &lt;span style="color: #008000"&gt;// member of type A, member of type B, mapping direction&lt;/span&gt;
      {a =&amp;gt; a.Name, b =&amp;gt; b.Name},               &lt;span style="color: #008000"&gt;// by default map in both directions&lt;/span&gt;
      {a =&amp;gt; a.Age, b =&amp;gt; b.Age},&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {a =&amp;gt; a.Gender, b =&amp;gt; b.Sex},
      { (a, b, d) =&amp;gt; b.Address = a.City + &lt;span style="color: #006080"&gt;" "&lt;/span&gt; + a.Street , Direction.A2B} 
        &lt;span style="color: #008000"&gt;// code snippet executed during mapping&lt;/span&gt;
  };
      
var customerDal = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CustomerDal { Id = 1, Name = &lt;span style="color: #006080"&gt;"Michael"&lt;/span&gt;, 
    City = &lt;span style="color: #006080"&gt;"Chicago"&lt;/span&gt;, Street = &lt;span style="color: #006080"&gt;"W Washington"&lt;/span&gt;, Age = 25, Gender = &lt;span style="color: #006080"&gt;'M'&lt;/span&gt;};
    
var customerBO = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CustomerBO();
m1.Map(customerDal, customerBO);

customerBO.Name = customerBO.Name + &lt;span style="color: #006080"&gt;"!"&lt;/span&gt;;
customerBO.Sex = &lt;span style="color: #006080"&gt;'F'&lt;/span&gt;;
customerBO.Age = customerBO.Age + 1;
         
m1.Map(customerBO, customerDal);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Again, instead of specifying mapped properties in code as string literals we use expression trees. Using expression trees is safer, cleaner and much more powerful. I showed you just two examples of real life application of ExpressionTrees that goes for beyond Linq. You saw the potential. Now imagine what you can do in your project with it.&lt;/p&gt;
&lt;p&gt;The source code for both examples you can be found &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=3723"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-4677078571642230937?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/4677078571642230937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=4677078571642230937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/4677078571642230937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/4677078571642230937'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2008/11/use-expression-tree-to-avoid-string_08.html' title='Use expression tree to avoid string literals in reflecting code part 2 (WorkflowArguments, WorkflowOutputParameters, Mapper)'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-4827591481606074054</id><published>2008-11-08T14:27:00.000-08:00</published><updated>2008-11-08T15:13:21.055-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ExpressionTrees'/><category scheme='http://www.blogger.com/atom/ns#' term='Reflection'/><category scheme='http://www.blogger.com/atom/ns#' term='C#3.0'/><title type='text'>Use expression tree to avoid string literals in "reflecting code" (ReflectionHelper)</title><content type='html'>&lt;p&gt;Reflection is a very useful mechanism letting us build very smart and flexible solutions. It is used in many places in .Net framework, for instance in Windows Forms to identify bound members or in Workflow Foundation to pass some parameters to workflow instance and many others. Those two samples have one common thing, we have to use string literals in code to identify type members such as properties. And of course it's not a problem if the types we use are not changing, it means once specified, member won't be changed in the future. Like which shouldn't change like .net framework types (it shouldn't be change cause of backward compatibility). &lt;/p&gt; &lt;p&gt;Lets imagine that we bind one property of our business object to a TextBox's property Text and one day during refactoring someone else changes the name or the type of the property or even worse - deletes it. The code will compile correctly but we can't be sure how it will work at runtime because it depends on the sort of change. Maybe some exception will be thrown, maybe everything will look fine but the property won't be set after modifying text in the TextBox or maybe all will work just fine. Such bugs are very unpredictable and very hard to find. Wouldn't it be nice if we could know just after change about possible problems (compilation failed). Sometimes we know than the property is used in many places in the code, so we rename it via our IDE (for instance in Visual Studio we can choose option 'Refactor -&amp;gt; Rename...') and we want be sure that everything works fine. Is this possible ? &lt;/p&gt; &lt;p&gt;Today I'll show you a utility class called &lt;strong&gt;ReflectionHelper&lt;/strong&gt; giving us the ability to realize mentioned scenario. Currently when we extract information about property via reflection we write something like this:&lt;/p&gt; &lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; SomeClass
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; InstanceProperty { get; set; }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; StaticProperty { get; set; }
}

PropertyInfo property1 = &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(SomeClass).GetProperty(&lt;span style="color: #006080"&gt;"InstanceProperty"&lt;/span&gt;);
PropertyInfo property2 = &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(SomeClass).GetProperty(&lt;span style="color: #006080"&gt;"StaticProperty"&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With ReflectionHelper the same code can be written like this:&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;PropertyInfo property3 = ReflectionHelper.GetProperty((SomeClass o) =&amp;gt; o.InstanceProperty );            
PropertyInfo property4 = ReflectionHelper.GetProperty(() =&amp;gt; SomeClass.StaticProperty);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is exactly what we wanted to achieve. We have created instance of PropertyInfo class without using any string literals. Now when we manually change the name of a property in one place, the code won't compile. If you rename it by 'Rename...' option in VS, code inside lambda expression will be changed too. &lt;/p&gt;
&lt;p&gt;Now, lets see how ReflectionHelper works. ReflectionHelper is a static class with 2 methods extracting information about given property. One for static properties and one for instance. The implementation is quite short and looks like this:&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; PropertyInfo GetProperty&amp;lt;TObject,T&amp;gt;(Expression&amp;lt;Func&amp;lt;TObject,T&amp;gt;&amp;gt; p) 
{ 
    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GetPropertyImpl(p); 
}
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; PropertyInfo GetProperty&amp;lt;T&amp;gt;(Expression&amp;lt;Func&amp;lt;T&amp;gt;&amp;gt; p) 
{ 
    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GetPropertyImpl(p); 
}
&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; PropertyInfo GetPropertyImpl(LambdaExpression p)
{
    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; (PropertyInfo)((MemberExpression)(p.Body)).Member;
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The key point to understand how the code works is a new feature of C#3.0 called &lt;strong&gt;expression trees&lt;/strong&gt;. In new version of C# we can use lambda expression in code. There are two kinds of lambda expression where the body of the method is a single expression ( x =&amp;gt; &lt;em&gt;x.ToString()&lt;/em&gt; ) or one or many statements (x =&amp;gt; &lt;em&gt;{return x.ToString(); }&lt;/em&gt; ).&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;Func&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt; expressionBody = (a) =&amp;gt; a + 1;
Func&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt; statementBody = (a) =&amp;gt; { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; a + 1; };&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In many places we use lambda with single expression body just because it's shorter but there is a scenario when we have to use it. Generally when compiler sees lambda expression in code it's treated as an anonymous method, but lambda expression can be also used to build expression trees. Lets look at the example:&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;Expression&amp;lt;Func&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt;&amp;gt; exp1 = (a) =&amp;gt; a + 1;
Expression&amp;lt;Func&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt;&amp;gt; exp2 = (a) =&amp;gt; { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; a + 1; }; 
// Error: A lambda expression with a statement body cannot be converted to an expression tree&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ok, but what is an expression tree actually? When compiler sees lambda with expression body not in the context of delegate type but in the context of special generic type 'System.Linq.Expressions.Expression&amp;lt;TDelegate&amp;gt;' a lot of code is generated behind the scenes. &lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;ParameterExpression p;
Expression&amp;lt;Func&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt;&amp;gt; exp1 = Expression.Lambda&amp;lt;Func&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt;&amp;gt;
(
    Expression.Add &lt;span style="color: #008000"&gt;// body&lt;/span&gt;
    (
        p = Expression.Parameter(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;), &lt;span style="color: #006080"&gt;"a"&lt;/span&gt;),
        Expression.Constant(1, &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;))
    ),
    &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ParameterExpression[] { p } &lt;span style="color: #008000"&gt;// parameters&lt;/span&gt;
);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The code of lambda expression is interpreted and translated into code that actually builds its structure. Use '&lt;a href="http://www.talentgrouplabs.com/blog/archive/2007/11/27/do-not-miss-the-expression-tree-visualizer.aspx"&gt;Expreesion Tree Visualizer&lt;/a&gt;' to better visualize the structure of expression tree.&lt;/p&gt;
&lt;p&gt;When we look back to implementation of &lt;strong&gt;GetProperty&lt;/strong&gt; method we can see that it takes an expression tree as a parameter. Inside the the method we make some assumptions about the structure of tree so we know exactly where information about property is stored. Of course if the structure of the tree would look differently, some exception could be thrown. The same technique can be used to extract information about &lt;strong&gt;fields&lt;/strong&gt;, &lt;strong&gt;methods&lt;/strong&gt; and &lt;strong&gt;constructors&lt;/strong&gt; (ReflectionHelper has appropriate functionality). In case of getting information about the methods there are different ways of doing it. &lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; SomeClass
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; InstanceMethod(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i) { }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Instead of writing literal call&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;var method = &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(SomeClass).GetMethod(&lt;span style="color: #006080"&gt;"InstanceMethod"&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;use ReflectionHelper like this:&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;var method = ReflectionHelper.GetMethod&amp;lt;SomeClass,&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt;(o =&amp;gt; o.InstanceMethod);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;or like this:&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;var method = ReflectionHelper.GetMethodByCall&amp;lt;SomeClass&amp;gt;(o =&amp;gt; o.InstanceMethod(1));&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The implementation looks like this:&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ReflectionHelper
{    
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; MethodInfo GetMethodByCall&amp;lt;TObject&amp;gt;(Expression&amp;lt;Action&amp;lt;TObject&amp;gt;&amp;gt; expression) 
    { 
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GetMethodByCallImpl(expression); 
    }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; MethodInfo GetMethodByCall(Expression&amp;lt;Action&amp;gt; expression) &lt;span style="color: #008000"&gt;// for static methods &lt;/span&gt;
    { 
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GetMethodByCallImpl(expression); 
    }
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; MethodInfo GetMethodByCallImpl(LambdaExpression expression)
    {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ((MethodCallExpression)expression.Body).Method;
    }    
    
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; MethodInfo GetMethod&amp;lt;TObject, T&amp;gt;(Expression&amp;lt;Func&amp;lt;TObject, Action&amp;lt;T&amp;gt;&amp;gt;&amp;gt; expression) 
    { 
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GetMethodImpl(expression); 
    }
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; MethodInfo GetMethod&amp;lt;T&amp;gt;(Expression&amp;lt;Func&amp;lt;Action&amp;lt;T&amp;gt;&amp;gt;&amp;gt; expression) &lt;span style="color: #008000"&gt;// for static methods &lt;/span&gt;
    { 
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GetMethodImpl(expression); 
    }
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; MethodInfo GetMethodImpl(LambdaExpression expression)
    {
        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; (MethodInfo)((ConstantExpression)((MethodCallExpression)((UnaryExpression)expression.
            Body).Operand).Arguments.Last()).Value;
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When we use &lt;strong&gt;GetMethod&lt;/strong&gt; method we don't need to write methods parameters inside brackets but we need to provide their types as generic method arguments (if parameters exist or method returns something). In the second approach we just write code executing method inside lambda expression. The code is never executed so we don't have to pass any correct arguments. These two approaches have one common disadvantage. When we change the signature of the method by changing parameters or return type, we need to change the code reflecting that method too. Maybe there is some solution but I couldn't find it :(&lt;/p&gt;
&lt;p&gt;Full implementation of ReflectionHelper class with code presenting many different scenarios of using them can be found &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=3716"&gt;here&lt;/a&gt;. In the next post I'll show you how the ReflectionHelper is used in real life :) Stay tuned!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-4827591481606074054?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/4827591481606074054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=4827591481606074054' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/4827591481606074054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/4827591481606074054'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2008/11/use-expression-tree-to-avoid-string.html' title='Use expression tree to avoid string literals in &amp;quot;reflecting code&amp;quot; (ReflectionHelper)'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-6698734974836404996</id><published>2008-09-25T11:59:00.000-07:00</published><updated>2008-10-01T23:48:08.929-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><category scheme='http://www.blogger.com/atom/ns#' term='C#3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='LinqToXml'/><title type='text'>XmlContentLoader</title><content type='html'>&lt;p&gt;As a subject of my first technical post I've chosen a small utility class built on the top of Linq. I have a pleasure to work with this really useful and powerful .Net Framework 3.5 feature which is Linq. It's quite possible that in next few posts I'll be writing about many issues related to Linq (LinqToXml, new C#3.0 in action and many others...)&lt;/p&gt;&lt;p&gt;Few weeks ago my team got a task to build very simple wizard application based on Windows Forms. The main goal of the wizard was to free end-users from doing configuration our applications by editing configuration files by hand. It was really straightforward, 4 or 5 step wizard basically giving ability to set some connection strings, email server settings and some WCF stuff. My part of the task was to prepare a component responsible for loading and saving selected xml elements or attributes from configuration file. As you can imagine the file was pretty big but we needed to change only some parts of them.&lt;/p&gt;&lt;p&gt;I decided to build more general-purpose component which I called XmlContentLoader. Firstly I'll show you sample scenario of using it, than some interesting parts of the realization.&lt;/p&gt;&lt;p&gt;Assume than we have xml file looking like this:&lt;/p&gt;&lt;div&gt;&lt;pre   style="border-style: none; margin: 0em; padding: 0px; overflow: visible; width: 100%; color: black; line-height: 12pt; background-color: rgb(244, 244, 244);font-family:consolas,'Courier New',courier,monospace;font-size:8pt;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;Root&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;A&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;some string...&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;A&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;AA&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
       &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;AAA&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;yo&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;AAA&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;AA&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;B&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;B&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;BB&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;BB&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;C&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
       &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;C1&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;c1Attribute&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="some string..."&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;C1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;C&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;D&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;dAttribute&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="2008.02.02"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;D&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;Root&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we want to load some parts of the file into memory, change it and save back to file. Assume than we want to write as little code as possible.&lt;/p&gt;&lt;p&gt;So we create the class (or structure) responsible for holding data from xml file (please note that the class can already exist in our application) containing properties corresponding to appropriate xml file items (elements or attributes). The xml item is chosen by defining xpath query returning xml element and optional attribute name (in case of choosing xml attribute).&lt;/p&gt;&lt;div&gt;&lt;pre   style="border-style: none; margin: 0em; padding: 0px; overflow: visible; width: 100%; color: black; line-height: 12pt; background-color: rgb(244, 244, 244);font-family:consolas,'Courier New',courier,monospace;font-size:8pt;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;internal&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; XmlContentLoaderTest
{
   [XmlItem(&lt;span style="color: rgb(0, 96, 128);"&gt;@"/Root/A[1]"&lt;/span&gt;)]
   [XmlItem(&lt;span style="color: rgb(0, 96, 128);"&gt;@"/Root/C/C1"&lt;/span&gt;, &lt;span style="color: rgb(0, 96, 128);"&gt;"c1Attribute"&lt;/span&gt;)]
   &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; MyString { get; set; }

   [XmlItem(&lt;span style="color: rgb(0, 96, 128);"&gt;@"/Root/B[1]"&lt;/span&gt;)]
   &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;bool&lt;/span&gt; MyBool { get; set; }

   [XmlItem(&lt;span style="color: rgb(0, 96, 128);"&gt;@"/Root/D[1]"&lt;/span&gt;, &lt;span style="color: rgb(0, 96, 128);"&gt;"dAttribute"&lt;/span&gt;)]
   &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; DateTime MyDateTime { get; set; }

   [XmlItem(&lt;span style="color: rgb(0, 96, 128);"&gt;@"/Root/C[1]/C1[1]"&lt;/span&gt;)]
   &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; Decimal MyDecimal { get; set; }
}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As you can see above one property can be mapped to many xml items. Once we have the data structure, we can load, modify and save xml file content.&lt;/p&gt;&lt;div&gt;&lt;pre   style="border-style: none; margin: 0em; padding: 0px; overflow: visible; width: 100%; color: black; line-height: 12pt; background-color: rgb(244, 244, 244);font-family:consolas,'Courier New',courier,monospace;font-size:8pt;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; filePath = &lt;span style="color: rgb(0, 96, 128);"&gt;"..."&lt;/span&gt;;
var a = XmlContentLoader.Load&amp;lt;XmlContentLoaderTest&amp;gt;(filePath);

a.MyBool = !a.MyBool;
a.MyString = a.MyString + &lt;span style="color: rgb(0, 96, 128);"&gt;"."&lt;/span&gt;;
a.MyDecimal = a.MyDecimal + 1;
a.MyDateTime = a.MyDateTime.AddDays(1);

XmlContentLoader.Save(filePath, a);&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It's all we can do with XmlContentLoader. Now let's see some details of the implementation.&lt;/p&gt;&lt;p&gt;XmlContentLoader has only 3 public methods.&lt;/p&gt;&lt;div&gt;&lt;pre   style="border-style: none; margin: 0em; padding: 0px; overflow: visible; width: 100%; color: black; line-height: 12pt; background-color: rgb(244, 244, 244);font-family:consolas,'Courier New',courier,monospace;font-size:8pt;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; T Load&amp;lt;T&amp;gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; filePath)
   &lt;span style="color: rgb(0, 0, 255);"&gt;where&lt;/span&gt; T : &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt;()
{
   &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; Load(filePath, &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; T());
}

&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; T Load&amp;lt;T&amp;gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; filePath, T @&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt;)
{
   &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (!File.Exists(filePath))           
       &lt;span style="color: rgb(0, 0, 255);"&gt;throw&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; FileNotFoundException(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;.Format(&lt;span style="color: rgb(0, 96, 128);"&gt;"File {0} does not exist"&lt;/span&gt;, filePath));

   XDocument document = XDocument.Load(filePath);
   &lt;span style="color: rgb(0, 0, 255);"&gt;foreach&lt;/span&gt; (var p &lt;span style="color: rgb(0, 0, 255);"&gt;in&lt;/span&gt; GetPropertyToXmlItemsMappings(@&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt;, document,
       &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; { Property = Type&amp;lt;PropertyInfo&amp;gt;(), XmlItems = Type&amp;lt;XmlItem[]&amp;gt;() }))
   {
       p.Property.SetValue(@&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt;,
           Converters[p.Property.PropertyType].ConvertFromString(p.XmlItems.First().Value),
           &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;);
   }

   &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; @&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt;;
}

&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; Save(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; filePath, &lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; @&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt;)
{
   &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (!File.Exists(filePath))           
       &lt;span style="color: rgb(0, 0, 255);"&gt;throw&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; FileNotFoundException(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;.Format(&lt;span style="color: rgb(0, 96, 128);"&gt;"File {0} does not exist"&lt;/span&gt;, filePath));

   XDocument document = XDocument.Load(filePath);
   &lt;span style="color: rgb(0, 0, 255);"&gt;foreach&lt;/span&gt; (var p &lt;span style="color: rgb(0, 0, 255);"&gt;in&lt;/span&gt; GetPropertyToXmlItemsMappings(@&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt;, document,
       &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; { Property = Type&amp;lt;PropertyInfo&amp;gt;(), XmlItems = Type&amp;lt;XmlItem[]&amp;gt;() }))
   {
       &lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; propertyValue = p.Property.GetValue(@&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;);
       &lt;span style="color: rgb(0, 0, 255);"&gt;foreach&lt;/span&gt; (var c &lt;span style="color: rgb(0, 0, 255);"&gt;in&lt;/span&gt; p.XmlItems)
           c.Value = Converters[p.Property.PropertyType].ConvertToString(propertyValue);
   }

   document.Save(filePath);
}


&lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; Dictionary&amp;lt;Type, TypeConverter&amp;gt; Converters { get; set; }

&lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; T Type&amp;lt;T&amp;gt;()
{
   &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;default&lt;/span&gt;(T);
}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The implementation of both Load and Save methods is very similar. We load xml document content into the memory using XElement class (added in new LinqToXml API in .Net3.5), then we just iterate throught collection of items returned from GetPropertyToXmlItemsMappings method. Each loop iteration sets new property value or gets the value from property and stores in xml document object structure. What's worth notice, we use TypeConverter class to provide convertion between Syste.String type and property type.&lt;/p&gt;&lt;p&gt;We don't know yet what is the type of the collection item :) So let's see the implementation of GetPropertyToXmlItemsMappings method.&lt;/p&gt;&lt;div&gt;&lt;pre   style="border-style: none; margin: 0em; padding: 0px; overflow: visible; width: 100%; color: black; line-height: 12pt; background-color: rgb(244, 244, 244);font-family:consolas,'Courier New',courier,monospace;font-size:8pt;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; T[] GetPropertyToXmlItemsMappings&amp;lt;T&amp;gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt; @&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt;, XNode document,
   T mappingTypeShape)
{
   var q =
       from p &lt;span style="color: rgb(0, 0, 255);"&gt;in&lt;/span&gt; @&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt;.GetType().GetProperties()
       &lt;span style="color: rgb(0, 0, 255);"&gt;where&lt;/span&gt; Attribute.IsDefined(p, &lt;span style="color: rgb(0, 0, 255);"&gt;typeof&lt;/span&gt;(XmlItemAttribute)) &amp;amp;&amp;amp;
             StoreTypeConverter(p.PropertyType) != &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;// check if type has TypeConverter&lt;/span&gt;
       select &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt;
       {
           Property = p,
           XmlItems =
           (
               from XmlItemAttribute a &lt;span style="color: rgb(0, 0, 255);"&gt;in&lt;/span&gt; Attribute.GetCustomAttributes(p,
                   &lt;span style="color: rgb(0, 0, 255);"&gt;typeof&lt;/span&gt;(XmlItemAttribute))
               select GetXmlItem(document, a)
           ).ToArray() &lt;span style="color: rgb(0, 128, 0);"&gt;// Force execution 'GetXmlItem()' method &lt;/span&gt;
                       &lt;span style="color: rgb(0, 128, 0);"&gt;// (check if all specified xml items exist)&lt;/span&gt;
       };

   &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; q.Cast&amp;lt;T&amp;gt;().ToArray(); &lt;span style="color: rgb(0, 128, 0);"&gt;// Force execution 'GetXmlItem()' method &lt;/span&gt;
                                 &lt;span style="color: rgb(0, 128, 0);"&gt;// (check if all specified xml items exist)&lt;/span&gt;
}

&lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; XmlItem GetXmlItem(XNode document, XmlItemAttribute a)
{
   &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; a.IsAttribute
              ? &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; XmlItem(ExtractAttribute(document, a.ElementPath, a.AttributeName))
              : &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; XmlItem(ExtractElement(document, a.ElementPath));
}

&lt;span style="color: rgb(0, 0, 255);"&gt;internal&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; XmlItem
{
   &lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; XElement Element { get; set; }
   &lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; XAttribute Attribute { get; set; }
   &lt;span style="color: rgb(0, 0, 255);"&gt;internal&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; Value
   {
       get
       {
           &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (Element != &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;)
               &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; Element.Value;
           &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; Attribute.Value;
       }
       set
       {
           &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (Element != &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;)
               Element.Value = &lt;span style="color: rgb(0, 0, 255);"&gt;value&lt;/span&gt;;
           &lt;span style="color: rgb(0, 0, 255);"&gt;else&lt;/span&gt;
               Attribute.Value = &lt;span style="color: rgb(0, 0, 255);"&gt;value&lt;/span&gt;;
       }
   }

   &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; XmlItem(XElement element)
   {
       Element = element;
   }
   &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; XmlItem(XAttribute attribute)
   {
       Attribute = attribute;
   }
}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ReSharper is so smart to tell me: "Parameter 'mappingTypeShape' is never used". So, what for did I add it to the method signature ? Is it really needed or not? Yes, it is. Because I wanted to use an anonymous type inside the method body instead of defining additional type myself (what for if compiler can do that for me ? ;) ) but outside of the method I needed to know the type of collection item. I had to specify somehow the type. But how ? it's an anonymous type. I gave exactly the same type shape as I did inside the method. The compiler is smart enough to use the same generated anonymous type. Don't ask me why I did it this way ... :)&lt;/p&gt;&lt;p&gt;I think XmlContentLoader can be very useful utility when you need to change only some parts of xml file in typed way without necessity to use xml serialization. Additionally when you use PropertyGrid control you can build pretty nice application in just few lines of code.&lt;/p&gt;&lt;p&gt;You can find source code &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=mnajder&amp;amp;DownloadId=3245"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-6698734974836404996?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/6698734974836404996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=6698734974836404996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/6698734974836404996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/6698734974836404996'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2008/09/xmlcontentloader_9568.html' title='XmlContentLoader'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-712077106443942647.post-4865820564845686871</id><published>2008-09-12T23:36:00.000-07:00</published><updated>2008-09-13T10:45:51.773-07:00</updated><title type='text'>Introduction</title><content type='html'>I'd like to welcome you on my blog!&lt;br&gt;
I have been thinking about blogging since last couple of months.  Now the time has come and I'm here :)&lt;br&gt;
At the beginning I'll introduce myself and try to explain why I'have just started this blog.&lt;br&gt;
My name is Marcin Najder, I work as a software developer in one of the biggest Polish companies. Mostly I work with newest Microsoft technologies such as VS2008, Sql Server 2008 and many, many other useful tools and frameworks. Just about those technologies I'm going to write. There are 2 main reasons for my blog:
&lt;ul&gt;&lt;li&gt;Blog as a place for improving my english. This is the first and foremost reason,&lt;/li&gt;
&lt;li&gt;In my day to day work I'm very often looking for solutions to many different problems. Many of them I find on blogs on the web. Maybe I'll be able to give you my solutions for your problems. It's all about sharing knowledge...&lt;/li&gt;&lt;/ul&gt;
I think it's enough for the first post. :) See you next time!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/712077106443942647-4865820564845686871?l=mnajder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mnajder.blogspot.com/feeds/4865820564845686871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=712077106443942647&amp;postID=4865820564845686871' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/4865820564845686871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/712077106443942647/posts/default/4865820564845686871'/><link rel='alternate' type='text/html' href='http://mnajder.blogspot.com/2008/09/introduction.html' title='Introduction'/><author><name>Marcin Najder</name><uri>http://www.blogger.com/profile/11205707928830073432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
