<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Bnaya Eshet : Beginner, SELA</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/SELA/default.aspx</link><description>Tags: Beginner, SELA</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>T 4 beginners – part 4</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/22/t-4-beginners-part-4.aspx</link><pubDate>Sat, 22 May 2010 12:02:33 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:630866</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;T 4 beginners – part 4&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/T4_63BDCAEB.jpg"&gt;&lt;img style="display:inline;margin-left:0px;margin-right:0px;" title="T4, VS 2010, Entity Framework, Custom tool" border="0" alt="T4, VS 2010, Entity Framework, Custom tool" src="http://blogs.microsoft.co.il/blogs/bnaya/T4_thumb_7DEE0E42.jpg" width="406" height="161" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;this is the 4rd post on this series. &lt;/p&gt;  &lt;p&gt;in this post we will focus on &lt;strong&gt;T4&lt;/strong&gt; &lt;strong&gt;Class feature control blocks&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;you can download the &lt;strong&gt;code &lt;/strong&gt;for this post &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/T4/3%5E6%20Class%20Feature%20Control%20Blocks?uc=1&amp;amp;isFromRichUpload=1"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;the series &lt;strong&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/19/t-4-beginners-toc.aspx"&gt;TOC&lt;/a&gt;&lt;/strong&gt; is available &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/19/t-4-beginners-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;What is class feature control block?&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;class feature control block&lt;/strong&gt; is one of the &lt;strong&gt;T4 extension&lt;/strong&gt; mechanism that &lt;strong&gt;enable reuse&lt;/strong&gt; of&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;T4&lt;/strong&gt; sections.&lt;/p&gt;  &lt;p&gt;using&lt;strong&gt; class feature control block&lt;/strong&gt; you can defines helper &lt;strong&gt;properties&lt;/strong&gt; or &lt;strong&gt;methods&lt;/strong&gt;,&lt;/p&gt;  &lt;p&gt;that can be used from different &lt;strong&gt;T4&lt;/strong&gt; templates.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;The syntax of class feature control block&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;class feature control block&lt;/strong&gt; is having the following syntax &lt;strong&gt;&amp;lt;#+&lt;/strong&gt; ... &lt;strong&gt;#&amp;gt;&lt;/strong&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9eda3c34-a68e-4658-9501-9a11a1dfff1f" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&amp;lt;#+&amp;#160;&amp;#160;&amp;#160;// Start of class feature block&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;private int Square(int i)&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return i*i;&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;#&amp;gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;this &lt;strong&gt;extension&lt;/strong&gt; can be use within &lt;strong&gt;control block&lt;/strong&gt; or &lt;strong&gt;expression control block&lt;/strong&gt;, as demonstrate:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cbe0b66c-585e-4502-a4e1-5f1a0f19527f" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;// This is hello number &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#= i+&lt;/span&gt;&lt;span style="color:#800080;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt; #&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;, square &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#= Square(i+&lt;/span&gt;&lt;span style="color:#800080;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;) #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;as you can the second &lt;strong&gt;expression block&lt;/strong&gt; is using the &lt;strong&gt;Square (&lt;font color="#808080"&gt;class feature method&lt;/font&gt;)&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Where &lt;strong&gt;class feature control block can be define?&lt;/strong&gt;&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;class feature control block&lt;/strong&gt; can be both &lt;strong&gt;inline&lt;/strong&gt; (which mean inside the T4 template) &lt;/p&gt;  &lt;p&gt;or &lt;strong&gt;external&lt;/strong&gt; (external helper file), which is more appropriate.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;How to define external &lt;strong&gt;class feature control block?&lt;/strong&gt;&lt;/h5&gt;  &lt;p&gt;to define &lt;strong&gt;class feature control block&lt;/strong&gt; in &lt;strong&gt;external&lt;/strong&gt; file, you should:&lt;/p&gt;  &lt;p&gt;1. add text file into your project &lt;/p&gt;  &lt;p&gt;(&lt;font color="#808080"&gt;I&amp;#39;m changing the text file extension to *.tt.extension, but you can use whatever extension you like&lt;/font&gt;).&lt;/p&gt;  &lt;p&gt;&lt;font color="#800000"&gt;update:&lt;/font&gt; &lt;em&gt;it is better to name the file extension *ttinclude&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;2. the &lt;strong&gt;class feature control block&lt;/strong&gt; should be added into the extension file.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;How to include external &lt;strong&gt;class feature control block?&lt;/strong&gt;&lt;/h5&gt;  &lt;p&gt;if you want to use external &lt;strong&gt;class feature control block&lt;/strong&gt; you should add&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb126478.aspx#Include" target="_blank"&gt;&lt;strong&gt;include&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;directive&lt;/strong&gt; to the T4 as demonstrate below:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e458132d-1ed5-4f84-a187-27e9485bd036" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#@ &lt;/span&gt;&lt;span style="color:#a52a2a;"&gt;include&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;file&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;ClassFeatureBlock.tt.extension&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot; #&amp;gt;&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;class feature control block&lt;/strong&gt; is one of the strength, you can simplify the T4 template&lt;/p&gt;  &lt;p&gt;by using predefine reusable methods.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Code sample available &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/T4/3%5E6%20Class%20Feature%20Control%20Blocks?uc=1&amp;amp;isFromRichUpload=1"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f22%2ft-4-beginners-part-4.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f22%2ft-4-beginners-part-4.aspx" /&gt;&lt;/a&gt; &lt;a href="http://dotnetshoutout.com/T-4-beginners-part-4-Export-Bnaya-Eshet"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fblogs.microsoft.co.il%2Fblogs%2Fbnaya%2Farchive%2F2010%2F05%2F22%2Ft-4-beginners-part-4.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:right;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f22%2ft-4-beginners-part-4.aspx&amp;amp;title=T+4+beginners+%e2%80%93+part+4"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=630866" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/VS2010/default.aspx">VS2010</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/T4/default.aspx">T4</category></item><item><title>T 4 beginners – part 3</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/21/t-4-beginners-part-3.aspx</link><pubDate>Sat, 22 May 2010 01:43:14 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:629481</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;T 4 beginners – part 3&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/T4_63BDCAEB.jpg"&gt;&lt;img style="display:inline;margin-left:0px;margin-right:0px;" title="T4, VS 2010, Entity Framework, Custom tool" border="0" alt="T4, VS 2010, Entity Framework, Custom tool" src="http://blogs.microsoft.co.il/blogs/bnaya/T4_thumb_7DEE0E42.jpg" width="406" height="161" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;this is the 3rd post on this series.&lt;/p&gt;  &lt;p&gt;in this post we will focus on basics &lt;strong&gt;T4&lt;/strong&gt; &lt;strong&gt;Control blocks&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;you can download the &lt;strong&gt;code sample &lt;/strong&gt;from &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/T4/2%5E6%20Control%20blocks?uc=1&amp;amp;isFromRichUpload=1"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;the series &lt;strong&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/19/t-4-beginners-toc.aspx"&gt;TOC&lt;/a&gt;&lt;/strong&gt; is available &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/19/t-4-beginners-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;T4&lt;/strong&gt; &lt;strong&gt;Control blocks&lt;/strong&gt; is where dynamic text is added into the template output, &lt;/p&gt;  &lt;p&gt;this is the heart of &lt;strong&gt;T4 &lt;/strong&gt;concept &lt;/p&gt;  &lt;p&gt;(&lt;font color="#808080"&gt;&lt;strong&gt;C#&lt;/strong&gt; is the &lt;strong&gt;default&lt;/strong&gt; language but you can change it to &lt;strong&gt;VB&lt;/strong&gt;&lt;/font&gt;).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Standard control blocks&lt;/h5&gt;  &lt;p&gt;A standard &lt;strong&gt;control block&lt;/strong&gt; is a &lt;strong&gt;section&lt;/strong&gt; of &lt;strong&gt;program code&lt;/strong&gt; that &lt;strong&gt;generates&lt;/strong&gt; part of the &lt;strong&gt;output&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;You can mix any number of text blocks and standard control blocks in a template file. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;However, you cannot place one control block inside another&lt;/font&gt;. &lt;/p&gt;  &lt;p&gt;Each standard &lt;strong&gt;control block&lt;/strong&gt; is delimited by the symbols&lt;strong&gt; &amp;lt;#&lt;/strong&gt; ... &lt;strong&gt;#&amp;gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a9f8fa99-79ee-4387-afd8-1c6834258cd6" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;/*&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;*&amp;#160;&amp;#160;generate on &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;# WriteLine(DateTime.Now.DayOfWeek.ToString()); #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;*/&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;the above snippet include &lt;strong&gt;control block&lt;/strong&gt; that write the current day of week.&lt;/p&gt;  &lt;p&gt;this is the code it generate:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f26db904-84db-4874-a326-1fee6d1401f8" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;/*&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;*&amp;#160;&amp;#160;generate on Friday&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;*/&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Expression control blocks&lt;/h5&gt;  &lt;p&gt;An &lt;strong&gt;expression control block&lt;/strong&gt; evaluates an expression and converts it to a string and insert it into the output file.&lt;/p&gt;  &lt;p&gt;the syntax of &lt;strong&gt;expression &lt;/strong&gt;&lt;strong&gt;control blocks&lt;/strong&gt; is using the &lt;strong&gt;&amp;lt;#=&lt;/strong&gt; …&lt;strong&gt; #&amp;gt;&lt;/strong&gt; syntax instead of &lt;strong&gt;&amp;lt;#&lt;/strong&gt; …&lt;strong&gt; #&amp;gt;&lt;/strong&gt; .&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:82a91644-0ac5-480c-a9eb-49ef91786f85" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;/*&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;*&amp;#160;&amp;#160;generate on &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#= DateTime.Now.DayOfWeek.ToString() #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;*/&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;both the &lt;strong&gt;WriteLine&lt;/strong&gt; and the&lt;strong&gt; ;&lt;/strong&gt; were omit.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the following snippets is using &lt;strong&gt;expression control block&lt;/strong&gt; combine with &lt;strong&gt;standard control block&lt;/strong&gt; which &lt;/p&gt;  &lt;p&gt;use for iterations:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:41ab08cb-2d3e-4829-9b6c-ef80544ca4e0" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&amp;#160;&lt;span style="color:#000000;"&gt;&amp;lt;#&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; i = &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;; i &amp;lt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt;; i++)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&lt;span style="color:#000000;"&gt;#&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;// This is hello number &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#= i+&lt;/span&gt;&lt;span style="color:#800080;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt; #&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;: Hello!&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&lt;span style="color:#000000;"&gt;#&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;lines 1-3&lt;/strong&gt;, start the iterations.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 5&lt;/strong&gt;, write &lt;strong&gt;text block&lt;/strong&gt; which embedded &lt;strong&gt;expression control block&lt;/strong&gt; that write the current iteration count.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 6-8&lt;/strong&gt;, close the iterations.&lt;/p&gt;  &lt;p&gt;the output will look like:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:bb0607da-0644-46fa-8f7e-0322a4112d44" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;// This is hello number 1: Hello!&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;// This is hello number 2: Hello!&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;// This is hello number 3: Hello!&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;// This is hello number 4: Hello!&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;the control block is what T4 is doing, create dynamic section&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f21%2ft-4-beginners-part-3.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f21%2ft-4-beginners-part-3.aspx" /&gt;&lt;/a&gt; &lt;a href="http://dotnetshoutout.com/T-4-beginners-part-3-Export-Bnaya-Eshet"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fblogs.microsoft.co.il%2Fblogs%2Fbnaya%2Farchive%2F2010%2F05%2F21%2Ft-4-beginners-part-3.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:right;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f21%2ft-4-beginners-part-3.aspx&amp;amp;title=T+4+beginners+%e2%80%93+part+3"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=629481" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/VS2010/default.aspx">VS2010</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/T4/default.aspx">T4</category></item><item><title>T 4 beginners – part 2</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/19/t-4-beginners-part-2.aspx</link><pubDate>Thu, 20 May 2010 02:09:46 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:624368</guid><dc:creator>bnaya</dc:creator><slash:comments>3</slash:comments><description>&lt;h2&gt;T 4 beginners – part 2&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/T4_63BDCAEB.jpg"&gt;&lt;img title="T4, VS 2010, Entity Framework, Custom tool" border="0" alt="T4, VS 2010, Entity Framework, Custom tool" src="http://blogs.microsoft.co.il/blogs/bnaya/T4_thumb_7DEE0E42.jpg" width="406" height="161" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;this is the second post on this series.&lt;/p&gt;  &lt;p&gt;in this post we will focus on basics &lt;strong&gt;T4&lt;/strong&gt;&amp;#160;&lt;strong&gt;Directives&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;you can use the &lt;strong&gt;code sample&lt;/strong&gt; of the previous post &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/T4/1%5E6%20Introduction?uc=1&amp;amp;isFromRichUpload=1&amp;amp;wa=wsignin1.0&amp;amp;sa=389052068" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;the series &lt;strong&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/19/t-4-beginners-toc.aspx" target="_blank"&gt;TOC&lt;/a&gt;&lt;/strong&gt; is available &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/19/t-4-beginners-toc.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Directive syntax:&lt;/h5&gt;  &lt;p&gt;any of the &lt;strong&gt;directives&lt;/strong&gt; is using the following syntax:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4dd87710-0cf0-4465-be4a-2eedf460db52" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#eeeeee;max-height:100px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#@ DirectiveName [ParameterName = &amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;ParameterValue&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;] #&amp;gt;&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;it start with &lt;strong&gt;&amp;lt;#@ &lt;/strong&gt;follow with the &lt;strong&gt;&lt;em&gt;directive name&lt;/em&gt;&lt;/strong&gt;,&lt;/p&gt;  &lt;p&gt;includes zero or more &lt;strong&gt;&lt;em&gt;name value parameters&lt;/em&gt;&lt;/strong&gt; and&lt;/p&gt;  &lt;p&gt;end with &lt;strong&gt;#&amp;gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;All parameter values must be surrounded by double quotation marks.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;If the value itself contains quotation marks, they must be escaped with the&lt;strong&gt; \&lt;/strong&gt; character. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;For example:&lt;/font&gt; &lt;font color="#808080"&gt;&lt;strong&gt;&amp;lt;#@&lt;/strong&gt; &lt;em&gt;DirectiveName&lt;/em&gt; &lt;em&gt;Parameter&lt;/em&gt;=&amp;quot; &lt;strong&gt;\&amp;quot; &lt;/strong&gt;quote &lt;strong&gt;\&amp;quot; &lt;/strong&gt;&amp;quot; &lt;strong&gt;#&amp;gt;&lt;/strong&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;T4 provide the following Directives:&lt;/h5&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6305b6f2-955b-431c-aad5-99930886ef2b" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#@ &lt;/span&gt;&lt;span style="color:#a52a2a;"&gt;output&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;extension&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;.cs&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;encoding&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;UNICODE&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot; #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;output directive&lt;/strong&gt; define the &lt;strong&gt;encoding&lt;/strong&gt; and &lt;strong&gt;extension&lt;/strong&gt; of the generated file.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;&lt;strong&gt;Template&lt;/strong&gt;&lt;/h6&gt;  &lt;p&gt;The &lt;strong&gt;template directive&lt;/strong&gt; allow the following parameters (&lt;font color="#808080"&gt;all the parameters are optional&lt;/font&gt;):&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:344331b0-1dc9-43ca-adde-bb681a9a1fac" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#@ &lt;/span&gt;&lt;span style="color:#a52a2a;"&gt;template&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;debug&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;language&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;C#&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot; #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;language&lt;/strong&gt;: the language define the programming language of the &lt;strong&gt;Control blocks&lt;/strong&gt; within the &lt;strong&gt;T4&lt;/strong&gt;       &lt;br /&gt;(&lt;font color="#808080"&gt;this is the language that used to process the &lt;strong&gt;T4&lt;/strong&gt; and it has nothing to do with the T4 output&lt;/font&gt;).       &lt;br /&gt;example: &lt;strong&gt;language&lt;/strong&gt; =&amp;quot;&lt;strong&gt;C#&amp;quot;&lt;/strong&gt; or &lt;strong&gt;language&lt;/strong&gt;=&amp;quot;&lt;strong&gt;VB&lt;/strong&gt;&amp;quot; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;debug&lt;/strong&gt;: indicate whether the template can be debug       &lt;br /&gt;(&lt;font color="#808080"&gt;we will cover debugging on later post&lt;/font&gt;) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;inherits&lt;/strong&gt;: is one of the possible ways to &lt;strong&gt;extend&amp;#160; T4&lt;/strong&gt;       &lt;br /&gt;(&lt;font color="#808080"&gt;we will discuss the inherit parameter in further post&lt;/font&gt;). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;&lt;strong&gt;Assembly&lt;/strong&gt;&lt;/h6&gt;  &lt;p&gt;The &lt;strong&gt;assembly directive&lt;/strong&gt; define the &lt;strong&gt;T4&lt;/strong&gt; &lt;strong&gt;dependencies&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;for example the following &lt;strong&gt;T4 Control block&lt;/strong&gt;:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:391e177a-92e5-491a-9657-bae24bc285e1" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#= System.DateTime.Now.ToString() #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;will result with &lt;strong&gt;exception&lt;/strong&gt; unless the following &lt;strong&gt;assembly directive&lt;/strong&gt; will be define:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4fb9db6f-cd73-4b40-96a8-92395c8231db" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#@ &lt;/span&gt;&lt;span style="color:#a52a2a;"&gt;Assembly&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;System.Core.dll&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot; #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;The assembly name should be one of the following:&lt;/font&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p&gt;&lt;font color="#808080"&gt;The file name of the assembly, if it is located in the same directory as the text template&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;font color="#808080"&gt;The absolute path of the assembly&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;font color="#808080"&gt;The relative path of the assembly (with respect to the directory in which the text template is located)&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;font color="#808080"&gt;The strong name of the assembly, as in the GAC.&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;font color="#808080"&gt;You can use the $(variableName) syntax to reference Visual Studio or MSBuild variables, and %VariableName% to reference environment variables.&lt;/font&gt;&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;&lt;strong&gt;Import&lt;/strong&gt;&lt;/h6&gt;  &lt;p&gt;the &lt;strong&gt;import directive&lt;/strong&gt; behave as &lt;strong&gt;using&lt;/strong&gt; statement for the &lt;strong&gt;T4 control block&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;as the case with other &lt;strong&gt;directive&lt;/strong&gt; it add nothing to the &lt;strong&gt;T4&lt;/strong&gt; output&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;using the following &lt;strong&gt;import directive&lt;/strong&gt;:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b4bbabf1-cc51-4472-8dcf-c45267f78ac4" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#@ &lt;/span&gt;&lt;span style="color:#a52a2a;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;System&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot; #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;you can replace the following full path &lt;strong&gt;control block&lt;/strong&gt;:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:28719a59-b718-43c4-ac3d-568e5c055f1b" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#= System.DateTime.Now.ToString() #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;with the following &lt;strong&gt;control block&lt;/strong&gt;:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:74e4324c-96a4-4c64-aa55-16a2e65d1c1e" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#= DateTime.Now.ToString() #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;T4 directive&lt;/strong&gt; is fairly intuitive and simple to use.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Resources&lt;/h5&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/bb126421.aspx" href="http://msdn.microsoft.com/en-us/library/bb126421.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb126421.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.codeproject.com/KB/codegen/T4CustGtc.aspx" href="http://www.codeproject.com/KB/codegen/T4CustGtc.aspx"&gt;http://www.codeproject.com/KB/codegen/T4CustGtc.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f19%2ft-4-beginners-part-2.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f19%2ft-4-beginners-part-2.aspx" /&gt;&lt;/a&gt; &lt;a href="http://dotnetshoutout.com/T-4-beginners-part-2-Export-Bnaya-Eshet"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fblogs.microsoft.co.il%2Fblogs%2Fbnaya%2Farchive%2F2010%2F05%2F19%2Ft-4-beginners-part-2.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=624368" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/VS2010/default.aspx">VS2010</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/T4/default.aspx">T4</category></item><item><title>T 4 beginners – TOC</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/19/t-4-beginners-toc.aspx</link><pubDate>Thu, 20 May 2010 02:02:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:624355</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;T 4 beginners – TOC&lt;/h2&gt;
&lt;p&gt;The current available posts on the T 4 beginner series (T4 template) are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/18/t-4-beginners-part-1.aspx" target="_blank"&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/19/t-4-beginners-part-2.aspx" target="_blank"&gt;Directives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div style="PADDING-BOTTOM:0px;MARGIN:0px;PADDING-LEFT:0px;PADDING-RIGHT:0px;PADDING-TOP:0px;" class="wlWriterHeaderFooter"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/21/t-4-beginners-part-3.aspx"&gt;&lt;font color="#350101"&gt;Control blocks&lt;/font&gt;&lt;/a&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div style="PADDING-BOTTOM:0px;MARGIN:0px;PADDING-LEFT:0px;PADDING-RIGHT:0px;PADDING-TOP:0px;" class="wlWriterHeaderFooter"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/22/t-4-beginners-part-4.aspx"&gt;&lt;font color="#350101"&gt;Class feature control blocks&lt;/font&gt;&lt;/a&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div style="PADDING-BOTTOM:0px;MARGIN:0px;PADDING-LEFT:0px;PADDING-RIGHT:0px;PADDING-TOP:0px;" class="wlWriterHeaderFooter"&gt;&lt;a title="Debug" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/06/05/t-4-beginners-part-5.aspx"&gt;Debug&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;script type="text/javascript"&gt;
&lt;/script&gt;

&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=624355" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/VS2010/default.aspx">VS2010</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/T4/default.aspx">T4</category></item><item><title>T 4 beginners – part 1</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/18/t-4-beginners-part-1.aspx</link><pubDate>Wed, 19 May 2010 01:47:13 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:622606</guid><dc:creator>bnaya</dc:creator><slash:comments>1</slash:comments><description>&lt;h2&gt;T 4 beginners – part 1&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/T4_63BDCAEB.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="T4, VS 2010, Entity Framework, Custom tool" border="0" alt="T4, VS 2010, Entity Framework, Custom tool" src="http://blogs.microsoft.co.il/blogs/bnaya/T4_thumb_7DEE0E42.jpg" width="406" height="161" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;this is the first post of a series that will focus on &lt;strong&gt;T4&lt;/strong&gt; template.&lt;/p&gt;  &lt;p&gt;this post discuss the &lt;strong&gt;T4&lt;/strong&gt; in general while the following pose will focus on the &lt;strong&gt;T4&lt;/strong&gt; practice.&lt;/p&gt;  &lt;p&gt;the code for this post can be found &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/T4/1%5E6%20Introduction?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;the series &lt;strong&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/19/t-4-beginners-toc.aspx" target="_blank"&gt;TOC&lt;/a&gt;&lt;/strong&gt; is available &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/19/t-4-beginners-toc.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;What is T4 template?&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;T4&lt;/strong&gt; is sanding for &lt;strong&gt;T&lt;/strong&gt;ext &lt;strong&gt;T&lt;/strong&gt;emplate &lt;strong&gt;T&lt;/strong&gt;ransformation &lt;strong&gt;T&lt;/strong&gt;oolkit.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;T4&lt;/strong&gt; is all about automating code or content generation.&lt;/p&gt;  &lt;p&gt;the usual extension for &lt;strong&gt;T4&lt;/strong&gt; files is the *.&lt;strong&gt;tt&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;When to use T4?&lt;/h5&gt;  &lt;p&gt;whenever you identify &lt;strong&gt;repeatable pattern&lt;/strong&gt; of code or content, that &lt;strong&gt;can be&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;infer&lt;/strong&gt; from other item within the project (&lt;font color="#808080"&gt;like the case of code that is &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;generate from a designer, &lt;/font&gt;&lt;font color="#808080"&gt;or entity framework self tracking entities&lt;/font&gt;),&lt;/p&gt;  &lt;p&gt;you should consider to automate it by using &lt;strong&gt;T4,&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;instead of writing it over and over again. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;What are the benefits?&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;T4&lt;/strong&gt; can bring the following benefits:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;speed-up the development process. &lt;/li&gt;    &lt;li&gt;increase the code consistency. &lt;/li&gt;    &lt;li&gt;make is easier to apply best practice. &lt;/li&gt;    &lt;li&gt;it is easy to start with prototype then modify it&amp;#39;s dynamic sections. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;T4&lt;/strong&gt; is very powerful concept because it is using &lt;strong&gt;C#&lt;/strong&gt; or &lt;strong&gt;VB.net&lt;/strong&gt; as it script language,       &lt;br /&gt;therefore it is lower the learning curve. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;The T4 structure&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;T4&lt;/strong&gt; are composed of the following parts:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Directives&lt;/strong&gt; - elements that control how the template is processed.         &lt;br /&gt;&amp;lt;#@ output extension=&amp;quot;.txt&amp;quot; #&amp;gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Text blocks&lt;/strong&gt; - content that is copied directly to the output.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;Control blocks&lt;/strong&gt; - program code that inserts variable values into the text,         &lt;br /&gt;and controls conditional or repeated parts of the text.         &lt;br /&gt;&amp;lt;#= System.DateTime.Now.ToString() #&amp;gt; &lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;&amp;#160;&lt;/h5&gt;  &lt;h5&gt;The syntax&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;T4&lt;/strong&gt; syntax resemble old ASP 3 syntax, it is an &lt;strong&gt;hybrid&lt;/strong&gt; of&amp;#160; &lt;strong&gt;text&lt;/strong&gt; and &lt;strong&gt;&amp;lt;#&lt;/strong&gt; &lt;strong&gt;c&lt;em&gt;ontrol blocks &lt;/em&gt;#&amp;gt;&lt;/strong&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cde691be-97aa-4d52-b740-33e065a9e077" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#@ &lt;/span&gt;&lt;span style="color:#a52a2a;"&gt;template&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;debug&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;hostSpecific&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot; #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#@ &lt;/span&gt;&lt;span style="color:#a52a2a;"&gt;output&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;extension&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;.cs&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot; #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#@ &lt;/span&gt;&lt;span style="color:#a52a2a;"&gt;Assembly&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;System.Core.dll&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot; #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#@ &lt;/span&gt;&lt;span style="color:#a52a2a;"&gt;Assembly&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;mscorlib.dll&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot; #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#@ &lt;/span&gt;&lt;span style="color:#a52a2a;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;System&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot; #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#@ &lt;/span&gt;&lt;span style="color:#a52a2a;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;System.Security.Principal&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot; #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;//using System.Security.Principal;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; Bnaya.Samples&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;// Last update on &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#= System.DateTime.Now.ToString() #&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Utils&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; GenerateBy ()&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#000000;"&gt;Console.WriteLine (&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;The code was generate on &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#= Environment.MachineName #&amp;gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#000000;"&gt;Console.WriteLine (&lt;/span&gt;&lt;span style="color:#800000;"&gt;@&amp;quot;by &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;#= WindowsIdentity.GetCurrent().Name #&amp;gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;we will discuss each T4 command in the following part of the series, but in general:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 1-6&lt;/strong&gt;: are &lt;strong&gt;directives&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Line 12 and lines 17,18&lt;/strong&gt;: has &lt;strong&gt;control blocks&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;any thing else is just text blocks.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the project will look as follow:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_0649AB53.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="T4, VS 2010, Entity Framework, Custom tool" border="0" alt="T4, VS 2010, Entity Framework, Custom tool" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_4A3D699D.png" width="272" height="190" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;generated&lt;/strong&gt; HelloWorld.cs will look as follow:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3a662631-e1e3-494f-8f2d-8d12c5805bc4" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;//using System.Security.Principal;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; Bnaya.Samples&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// Last update on 5/18/2010 7:29:10&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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; &lt;span style="color:#2b91af;"&gt;Utils&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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; GenerateBy ()&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine (&lt;span style="color:#a31515;"&gt;&amp;quot;The code was generate on BNAYA-PC&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine (&lt;span style="color:#a31515;"&gt;@&amp;quot;by Bnaya-PC&amp;#92;Bnaya&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;notice that the date at &lt;strong&gt;line 5&lt;/strong&gt; and part of the text at &lt;strong&gt;lines 10, 11&lt;/strong&gt; was &lt;strong&gt;generate&lt;/strong&gt; by the &lt;strong&gt;T4&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;What do you need to get it operating?&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;T4&lt;/strong&gt; is part of &lt;strong&gt;Visual Studio 2010&lt;/strong&gt;, which mean that you can add &lt;strong&gt;T4&lt;/strong&gt; template to any of&lt;/p&gt;  &lt;p&gt;your project (just by adding item and selecting one of the &lt;strong&gt;T4&lt;/strong&gt; item template).&lt;/p&gt;  &lt;p&gt;what&amp;#39;s missing is the IntelliSense and syntax coloring capability.&lt;/p&gt;  &lt;p&gt;you can add the syntax coloring and IntelliSense by installing the following VS extension gallery:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://visualstudiogallery.msdn.microsoft.com/en-us/60297607-5fd4-4da4-97e1-3715e90c1a23" href="http://visualstudiogallery.msdn.microsoft.com/en-us/60297607-5fd4-4da4-97e1-3715e90c1a23"&gt;http://visualstudiogallery.msdn.microsoft.com/en-us/60297607-5fd4-4da4-97e1-3715e90c1a23&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;T4&lt;/strong&gt; can &lt;strong&gt;boost&lt;/strong&gt; your coding &lt;strong&gt;productivity&lt;/strong&gt; by automating repeatable patterns.&lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f18%2ft-4-beginners-part-1.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f18%2ft-4-beginners-part-1.aspx" /&gt;&lt;/a&gt; &lt;a href="http://dotnetshoutout.com/T-4-beginners-part-1-Export-Bnaya-Eshet"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fblogs.microsoft.co.il%2Fblogs%2Fbnaya%2Farchive%2F2010%2F05%2F18%2Ft-4-beginners-part-1.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=622606" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/VS2010/default.aspx">VS2010</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/T4/default.aspx">T4</category></item><item><title>MEF for Beginner (Deployment Catalog) - part 12</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/04/01/mef-for-beginner-deployment-catalog-part-12.aspx</link><pubDate>Fri, 02 Apr 2010 01:20:55 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:572185</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;MEF for Beginner (Deployment Catalog) - part 12&lt;/h2&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 15px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="deployment catalog,MEF,Import,Importmany,export,compose,composition" border="0" alt="deployment catalog,MEF,Import,Importmany,export,compose,composition" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/deploymentcatalog_2D5B1AB5.jpg" width="131" height="156" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;this is the 12th post of the &lt;a href="http://mef.codeplex.com/"&gt;&lt;strong&gt;MEF&lt;/strong&gt;&lt;/a&gt; for Beginner series, the series &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx"&gt;TOC&lt;/a&gt; is available &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;this post will focus on&lt;strong&gt; Deployment Catalog&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the code sample for this post can be found &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%2012?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;&amp;#160;&lt;/h5&gt;  &lt;h5&gt;What is MEF Deployment Catalogs?&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;deployment catalog&lt;/strong&gt; is actually a redesign of the older&lt;strong&gt; package catalog&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;it enable to &lt;strong&gt;load parts&lt;/strong&gt; from &lt;strong&gt;xap&lt;/strong&gt; packages a-synchronically.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Code sample&lt;/h5&gt;  &lt;p&gt;the following code sample depend on 2 assembly that should be added to the project:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;System.ComponentModel.Composition &lt;/li&gt;    &lt;li&gt;System.ComponentModel.Composition.Initialization &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;at the startup (&lt;strong&gt;app.xaml&lt;/strong&gt;)&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1445eb1a-5ba2-480c-82bd-bd8ae0324ac5" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Application_Startup(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender,&lt;span style="color:#2b91af;"&gt;StartupEventArgs&lt;/span&gt; e)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;InitializeContainer();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.RootVisual = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MainPage&lt;/span&gt;();&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InitializeContainer()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; catalogs = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AggregateCatalog&lt;/span&gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeCatalog&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;PlugIns&lt;/span&gt;));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;catalogs.Catalogs.Add(catalog);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// Create deployment catalog&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; deployCatalog = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DeploymentCatalog&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;PlugIns.xap&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;deployCatalog.DownloadCompleted += OnDownloadCompletedHandler;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;deployCatalog.DownloadProgressChanged += OnDownloadProgressChangedHandler;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;deployCatalog.DownloadAsync();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;catalogs.Catalogs.Add(deployCatalog);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// initialize the main application composition host (container)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;CompositionHost&lt;/span&gt;.Initialize(catalogs);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;line 3&lt;/strong&gt;, &lt;strong&gt;initialize&lt;/strong&gt; &lt;strong&gt;MEF&lt;/strong&gt; before the creation of any windows that depend on MEF.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 9&lt;/strong&gt;, define &lt;strong&gt;aggregate catalog&lt;/strong&gt; (this is basically a catalog collection). &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 11-12&lt;/strong&gt;, create &lt;strong&gt;type catalog&lt;/strong&gt; for plug-ins within the &lt;strong&gt;main&lt;/strong&gt; &lt;strong&gt;xap&lt;/strong&gt; (plug-in within the main xap&lt;/p&gt;  &lt;p&gt;can be assess directly) and add the catalog to the &lt;strong&gt;aggregate catalog&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 15&lt;/strong&gt;, create &lt;strong&gt;deployment catalog&lt;/strong&gt; (it get the xap relative path as parameter).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 16-17&lt;/strong&gt;, register for &lt;strong&gt;xap&lt;/strong&gt; &lt;strong&gt;download process&lt;/strong&gt; events (&lt;strong&gt;optional&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 18&lt;/strong&gt;, start &lt;strong&gt;downloading&lt;/strong&gt; the xap.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 20&lt;/strong&gt;, add the &lt;strong&gt;deployment catalog&lt;/strong&gt; to the &lt;strong&gt;aggregate catalog&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 23&lt;/strong&gt;, &lt;strong&gt;initialize&lt;/strong&gt; the &lt;strong&gt;composition host&lt;/strong&gt; with the &lt;strong&gt;aggregate catalog&lt;/strong&gt; (so &lt;/p&gt;  &lt;p&gt;latter using &lt;strong&gt;CompositionInitializer.SatisfyImports&lt;/strong&gt; will operate against the &lt;strong&gt;aggregate catalog&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;at the &lt;strong&gt;MainPage.xaml&lt;/strong&gt; the code will look as follow:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ac24aa17-da47-4416-b1c8-eca20f21e845" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&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; &lt;span style="color:#2b91af;"&gt;MainPage&lt;/span&gt;:&lt;span style="color:#2b91af;"&gt;UserControl&lt;/span&gt;,&lt;span style="color:#2b91af;"&gt;INotifyPropertyChanged&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; MainPage()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;InitializeComponent();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.DataContext = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;CompositionInitializer&lt;/span&gt;.SatisfyImports(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; _plugIns;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;span style="color:#2b91af;"&gt;ImportMany&lt;/span&gt;(AllowRecomposition = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; PlugIns&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _plugIns;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;_plugIns = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(PropertyChanged != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;PropertyChanged(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;,&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PropertyChangedEventArgs&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;PlugIns&amp;quot;&lt;/span&gt;));&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;event&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PropertyChangedEventHandler&lt;/span&gt; PropertyChanged;&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 7&lt;/strong&gt;, asking &lt;strong&gt;MEF&lt;/strong&gt; to &lt;strong&gt;satisfy&lt;/strong&gt; any &lt;strong&gt;import&lt;/strong&gt; of the current instance (in our case the PlugIns property).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 11&lt;/strong&gt;, decorate the &lt;strong&gt;PlugIns&lt;/strong&gt; property for being assigned by the &lt;strong&gt;MEF&lt;/strong&gt; composition.&lt;/p&gt;  &lt;p&gt;notice that the decoration define &lt;strong&gt;AllowRecomposition = true, &lt;/strong&gt;this is very important&lt;/p&gt;  &lt;p&gt;because the &lt;strong&gt;deployment catalog&lt;/strong&gt; is &lt;strong&gt;a-synchronic,&lt;/strong&gt; therefore we do not control the exact time of the assignment.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;deployment catalog&lt;/strong&gt; is the current way for &lt;strong&gt;delay composition&lt;/strong&gt; from &lt;strong&gt;xap&lt;/strong&gt; packages.&lt;/p&gt;  &lt;p&gt;it is a-synchronic and it will notify the catalog upon the download completion.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;the code sample for this post can be found &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%2012?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Learn more&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://codebetter.com/blogs/glenn.block/archive/2010/03/07/building-hello-mef-part-iv-deploymentcatalog.aspx" href="http://codebetter.com/blogs/glenn.block/archive/2010/03/07/building-hello-mef-part-iv-deploymentcatalog.aspx"&gt;http://codebetter.com/blogs/glenn.block/archive/2010/03/07/building-hello-mef-part-iv-deploymentcatalog.aspx&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a title="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2010/02/24/mef-silverlight-and-the-deploymentcatalog.aspx" href="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2010/02/24/mef-silverlight-and-the-deploymentcatalog.aspx"&gt;http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2010/02/24/mef-silverlight-and-the-deploymentcatalog.aspx&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f04%2f01%2fmef-for-beginner-deployment-catalog-part-12.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f04%2f01%2fmef-for-beginner-deployment-catalog-part-12.aspx" /&gt;&lt;/a&gt; &lt;a href="http://dotnetshoutout.com/MEF-for-Beginner-Deployment-Catalog-part-12-Export-Bnaya-Eshet"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fblogs.microsoft.co.il%2Fblogs%2Fbnaya%2Farchive%2F2010%2F04%2F01%2Fmef-for-beginner-deployment-catalog-part-12.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=572185" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx">MEF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Extensibility/default.aspx">Extensibility</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx">CLR 4</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/extension/default.aspx">extension</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IoC/default.aspx">IoC</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx">Composition</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ImportMany/default.aspx">ImportMany</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Export/default.aspx">Export</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Import/default.aspx">Import</category></item><item><title>Rx - for beginners (part 13): Publish (broadcast to many subscribers)</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/31/rx-for-beginners-part-13-publish-broadcast-to-many-subscribers.aspx</link><pubDate>Thu, 01 Apr 2010 00:04:28 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:570643</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;Rx - for beginners (part 13): Publish (broadcast to many subscribers)&lt;/h2&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 15px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="IObservable,IObserver,Observable,Rx" border="0" alt="IObservable,IObserver,Observable,Rx" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/1266073365_kghostview_481A94D9.jpg" width="83" height="83" /&gt; this post is the 13th in a series of posts about the new &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Reactive Framework&lt;/a&gt;&lt;/strong&gt; (&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Rx&lt;/a&gt;&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;the series &lt;strong&gt;TOC&lt;/strong&gt; can found &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;in this post we will focus on the &lt;strong&gt;Publish &lt;/strong&gt;operator.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the code for this post available &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%2013?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;let guess&lt;strong&gt; how many times&lt;/strong&gt; the &lt;strong&gt;select&lt;/strong&gt; statement &lt;strong&gt;will be invoke&lt;/strong&gt; for the following code,&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;the underline stream will produce 2 value (0, 1)&lt;/font&gt;?&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:67b670db-03f1-430a-9c34-7fa6ad0837dd" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#2b91af;"&gt;IObservable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;long&lt;/span&gt;&amp;gt; observableRoot = &lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.Interval(&lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(1));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; producer = &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; observableRoot&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; item &amp;lt; 2&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; item;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;producer.Subscribe(value =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;A: &amp;quot;&lt;/span&gt; + value));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;producer.Subscribe(value =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;B: &amp;quot;&lt;/span&gt; + value));&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the answer is &lt;strong&gt;4 times&lt;/strong&gt;, actually the &lt;strong&gt;select&lt;/strong&gt; statement will be invoked for each of the &lt;strong&gt;subscription&lt;/strong&gt; (in this sample we having 2 on lines 7-8),&lt;/p&gt;  &lt;p&gt;each time that the &lt;strong&gt;producer&lt;/strong&gt; (observable) will &lt;strong&gt;produced&lt;/strong&gt; value.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;in order to emphasis the problem I did some minor changes to the &lt;strong&gt;Linq&lt;/strong&gt; query:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:dbe72172-6c68-4f9f-ade5-07bb70ecf3ff" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#2b91af;"&gt;IObservable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;long&lt;/span&gt;&amp;gt; observableRoot = &lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.Interval(&lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(1));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; producer = observableRoot.Where(item =&amp;gt; item &amp;lt; 2);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;producer = producer.Select(item =&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;X&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; item;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;});&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;producer.Subscribe(value =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;A: &amp;quot;&lt;/span&gt; + value));&lt;/li&gt; &lt;li&gt;producer.Subscribe(value =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;B: &amp;quot;&lt;/span&gt; + value));&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;as you can see at &lt;strong&gt;line 3&lt;/strong&gt;, we doing the &lt;strong&gt;where&lt;/strong&gt; part,&lt;/p&gt;  &lt;p&gt;and at &lt;strong&gt;lines 4-8 &lt;/strong&gt;we doing the &lt;strong&gt;select&lt;/strong&gt; part + writing X to the console each time that the &lt;strong&gt;select&lt;/strong&gt; occurs.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the output for this code will look as follow:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="IObservable,IObserver,Observable,Rx" border="0" alt="IObservable,IObserver,Observable,Rx" src="http://blogs.microsoft.co.il/blogs/bnaya/image_3E7226A3.png" width="165" height="179" /&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;So we do have a problem!&lt;/h5&gt;  &lt;p&gt;in lot of cases we would like to &lt;strong&gt;broadcast&lt;/strong&gt; the same value for any of the registered &lt;strong&gt;subscriber&lt;/strong&gt; without&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;recalculating&lt;/strong&gt; different value for each of the &lt;strong&gt;subscription&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;How can we do it using the Rx framework?&lt;/h5&gt;  &lt;p&gt;the solution is to &lt;strong&gt;separate&lt;/strong&gt; the &lt;strong&gt;subscriber&lt;/strong&gt; from the &lt;strong&gt;underline&lt;/strong&gt; &lt;strong&gt;producer&lt;/strong&gt; &lt;strong&gt;stream?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the separation is done in 2 steps:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;step one&lt;/strong&gt;, &lt;strong&gt;isolating&lt;/strong&gt; from the &lt;strong&gt;underline stream&lt;/strong&gt;, it is done by using the &lt;strong&gt;Publish&lt;/strong&gt; operator.&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;publish&lt;/strong&gt; operator return &lt;strong&gt;non active IConnectableObservable &lt;/strong&gt;which mean that&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;subscribers&lt;/strong&gt; can &lt;strong&gt;subscribe&lt;/strong&gt; to this &lt;strong&gt;producer&lt;/strong&gt; &lt;strong&gt;isolation&lt;/strong&gt;, but the producer isolation &lt;/p&gt;  &lt;p&gt;does not yet listening to the underline stream.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;step two&lt;/strong&gt;, connecting to the underline stream by using &lt;strong&gt;Connect&lt;/strong&gt; operator.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the code will look as follow:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4852d368-01ce-4282-8353-c3039c3b9eb0" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#2b91af;"&gt;IObservable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;long&lt;/span&gt;&amp;gt; observableRoot = &lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.Interval(&lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(1));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; producer = observableRoot.Where(item =&amp;gt; item &amp;lt; 2);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;producer = producer.Select(item =&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;X&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; item;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;});&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#2b91af;"&gt;IConnectableObservable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;long&lt;/span&gt;&amp;gt; producerAbstraction = producer.Publish();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;producerAbstraction.Subscribe(value =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;A: &amp;quot;&lt;/span&gt; + value));&lt;/li&gt; &lt;li&gt;producerAbstraction.Subscribe(value =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;B: &amp;quot;&lt;/span&gt; + value));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;producerAbstraction.Connect();&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;font color="#808080"&gt;nothing changed till line 10&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 10&lt;/strong&gt;, &lt;strong&gt;creation&lt;/strong&gt; of &lt;strong&gt;IConnectableObservable&lt;/strong&gt; abstraction (producerAbstraction) (which is not active yet).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 12-13&lt;/strong&gt;, is similar to the previous &lt;strong&gt;subscription&lt;/strong&gt;, but now the &lt;strong&gt;subscription&lt;/strong&gt; is for the &lt;strong&gt;abstraction layer&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;of producerAbstraction (instead of subscribing to the underline stream).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 15&lt;/strong&gt;, &lt;strong&gt;connect&lt;/strong&gt; the producerAbstraction to the &lt;strong&gt;underline producer stream&lt;/strong&gt; (only at this point values will start &lt;/p&gt;  &lt;p&gt;flowing into the &lt;strong&gt;subscribers&lt;/strong&gt; callbacks).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the output will be:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="IObservable,IObserver,Observable,Rx" border="0" alt="IObservable,IObserver,Observable,Rx" src="http://blogs.microsoft.co.il/blogs/bnaya/image_44894D71.png" width="165" height="179" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;as you can see, no duplicate select occurs.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;you should be aware of the &lt;strong&gt;subscription behavior&lt;/strong&gt;, and apply the right pattern that&lt;/p&gt;  &lt;p&gt;match your needs.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the code for this post available &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%2013?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://dotnetshoutout.com/Rx-for-beginners-part-13-Publish-broadcast-to-many-subscribers-Export-Bnaya-Eshet"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fblogs.microsoft.co.il%2Fblogs%2Fbnaya%2Farchive%2F2010%2F03%2F31%2Frx-for-beginners-part-13-publish-broadcast-to-many-subscribers.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=570643" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx">Rx</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx">IObserver</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx">Reactive Extensions</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx">Parallel</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx">IObservable</category></item><item><title>Rx - for beginners (part 12): RxJs</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/30/rx-for-beginners-part-12-rxjs.aspx</link><pubDate>Tue, 30 Mar 2010 16:43:20 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:567812</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;this post is the 11th in a series of posts about the new &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Reactive Framework&lt;/a&gt;&lt;/strong&gt; (&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Rx&lt;/a&gt;&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;the series &lt;strong&gt;TOC&lt;/strong&gt; can found &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;in this post we will focus on &lt;strong&gt;Rx for JavaScript&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the recently the Rx team release JavaScript library that capable to&lt;/p&gt;  &lt;p&gt;get observable stream from events.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;for example the syntax for mouse move event will be:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c973889b-49e4-4d09-a071-25d4a511bda0" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; mouseMove = Rx.Observable.FromJQueryEvent($(document), &lt;span style="color:#a31515;"&gt;&amp;quot;mousemove&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;all you have to do in order of using this library is to rx.js which is less than 7Kb (GZipped).&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:713fb3cd-0f14-4f94-bd88-9dce57dd7cec" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;src&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;rx.js&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;you can download the installation from &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the installation include sample code that demonstrate old good JavaScript trick of&lt;/p&gt;  &lt;p&gt;attacking sting tail to the mouse move event.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;script src="http://code.jquery.com/jquery-latest.js"&gt;&lt;/script&gt;&lt;script src="http://jeffrey.reactiveextensions.net/rx.js"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;
function FromJQueryEventOffset(ele, evt)
	{
		var obs = Rx.Observable.FromJQueryEvent(ele, evt);
		return obs.Select(function(value)
		{
			var x = ele.offset();
			return { offsetX : value.clientX - x.left + $(document).scrollLeft(), offsetY : value.clientY - x.top + $(document).scrollTop() };
			
		});
		
		
	}

        &lt;/script&gt;  &lt;div&gt;to see the effect move the mouse on the gray panel.&lt;/div&gt;  &lt;div style="position:relative;border-bottom-style:solid;border-right-style:solid;background-color:#333333;width:500px;font-family:&amp;#39;Comic Sans MS&amp;#39;;border-top-style:solid;height:200px;color:#ffffff;font-size:20px;border-left-style:solid;overflow:hidden;font-weight:800;" id="container"&gt;&lt;span style="position:absolute;top:13px;left:497px;"&gt;R&lt;/span&gt;&lt;span style="position:absolute;top:13px;left:507px;"&gt;x&lt;/span&gt;&lt;span style="position:absolute;top:13px;left:517px;"&gt; &lt;/span&gt;&lt;span style="position:absolute;top:13px;left:527px;"&gt;o&lt;/span&gt;&lt;span style="position:absolute;top:13px;left:537px;"&gt;n&lt;/span&gt;&lt;span style="position:absolute;top:13px;left:547px;"&gt; &lt;/span&gt;&lt;span style="position:absolute;top:13px;left:557px;"&gt;j&lt;/span&gt;&lt;span style="position:absolute;top:13px;left:567px;"&gt;a&lt;/span&gt;&lt;span style="position:absolute;top:13px;left:577px;"&gt;v&lt;/span&gt;&lt;span style="position:absolute;top:13px;left:587px;"&gt;a&lt;/span&gt;&lt;span style="position:absolute;top:13px;left:597px;"&gt;s&lt;/span&gt;&lt;span style="position:absolute;top:13px;left:607px;"&gt;c&lt;/span&gt;&lt;span style="position:absolute;top:13px;left:617px;"&gt;r&lt;/span&gt;&lt;span style="position:absolute;top:13px;left:627px;"&gt;i&lt;/span&gt;&lt;span style="position:absolute;top:13px;left:637px;"&gt;p&lt;/span&gt;&lt;span style="position:absolute;top:13px;left:647px;"&gt;t&lt;/span&gt;&lt;span style="position:absolute;top:121px;left:259px;"&gt;R&lt;/span&gt;&lt;span style="position:absolute;top:121px;left:269px;"&gt;x&lt;/span&gt;&lt;span style="position:absolute;top:121px;left:279px;"&gt; &lt;/span&gt;&lt;span style="position:absolute;top:121px;left:289px;"&gt;o&lt;/span&gt;&lt;span style="position:absolute;top:121px;left:299px;"&gt;n&lt;/span&gt;&lt;span style="position:absolute;top:121px;left:309px;"&gt; &lt;/span&gt;&lt;span style="position:absolute;top:121px;left:319px;"&gt;j&lt;/span&gt;&lt;span style="position:absolute;top:121px;left:329px;"&gt;a&lt;/span&gt;&lt;span style="position:absolute;top:121px;left:339px;"&gt;v&lt;/span&gt;&lt;span style="position:absolute;top:121px;left:349px;"&gt;a&lt;/span&gt;&lt;span style="position:absolute;top:121px;left:359px;"&gt;s&lt;/span&gt;&lt;span style="position:absolute;top:121px;left:369px;"&gt;c&lt;/span&gt;&lt;span style="position:absolute;top:121px;left:379px;"&gt;r&lt;/span&gt;&lt;span style="position:absolute;top:121px;left:389px;"&gt;i&lt;/span&gt;&lt;span style="position:absolute;top:121px;left:399px;"&gt;p&lt;/span&gt;&lt;span style="position:absolute;top:121px;left:409px;"&gt;t&lt;/span&gt;&lt;span style="position:absolute;"&gt;R&lt;/span&gt;&lt;span style="position:absolute;"&gt;x&lt;/span&gt;&lt;span style="position:absolute;"&gt; &lt;/span&gt;&lt;span style="position:absolute;"&gt;o&lt;/span&gt;&lt;span style="position:absolute;"&gt;n&lt;/span&gt;&lt;span style="position:absolute;"&gt; &lt;/span&gt;&lt;span style="position:absolute;"&gt;j&lt;/span&gt;&lt;span style="position:absolute;"&gt;a&lt;/span&gt;&lt;span style="position:absolute;"&gt;v&lt;/span&gt;&lt;span style="position:absolute;"&gt;a&lt;/span&gt;&lt;span style="position:absolute;"&gt;s&lt;/span&gt;&lt;span style="position:absolute;"&gt;c&lt;/span&gt;&lt;span style="position:absolute;"&gt;r&lt;/span&gt;&lt;span style="position:absolute;"&gt;i&lt;/span&gt;&lt;span style="position:absolute;"&gt;p&lt;/span&gt;&lt;span style="position:absolute;"&gt;t&lt;/span&gt;&lt;/div&gt; &lt;script type="text/javascript"&gt;
		$(document).ready(function()
		{
                	var container = $(&amp;quot;#container&amp;quot;);
	                var mouseMove = FromJQueryEventOffset(container, &amp;quot;mousemove&amp;quot;);
	
        	        var text = &amp;quot;Rx on javascript&amp;quot;;
	
        	        for (var i = 0; i &lt;/script&gt;  &lt;p&gt;the full code for this trick is:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3d76d7e3-4451-4553-a5e4-eb5596f6b9b0" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;html&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;head&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Rx for JavaScript Rocks!&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;src&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;src&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;rx.js&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;$(document).ready(&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;() &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{ &lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; mouseMove = Rx.Observable.FromJQueryEvent($(document), &lt;span style="color:#a31515;"&gt;&amp;quot;mousemove&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt; &lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; text = &lt;span style="color:#a31515;"&gt;&amp;quot;time flies like an arrow&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; container = $(&lt;span style="color:#a31515;"&gt;&amp;quot;#container&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; i = 0; i &amp;lt; text.length; i++)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;(&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(i)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; s = $(document.createElement(&lt;span style="color:#a31515;"&gt;&amp;quot;span&amp;quot;&lt;/span&gt;));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;s.html(text.charAt(i));&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;s.css({ position: &lt;span style="color:#a31515;"&gt;&amp;quot;absolute&amp;quot;&lt;/span&gt; });&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;s.appendTo(container);&lt;/li&gt; &lt;li&gt; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;mouseMove.Delay(i * 100).Subscribe(&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(mouseEvent)&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;s.css({ top: mouseEvent.clientY + &lt;span style="color:#a31515;"&gt;&amp;quot;px&amp;quot;&lt;/span&gt;, &lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;left: mouseEvent.clientX + i * 10 + 15 + &lt;span style="color:#a31515;"&gt;&amp;quot;px&amp;quot;}&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;});&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;})(i);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;});&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;head&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;body&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;font-family&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;Consolas,&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;monospace&lt;/span&gt;; &lt;span style="color:#ff0000;"&gt;overflow&lt;/span&gt;: &lt;span style="color:#0000ff;"&gt;hidden&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;container&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;body&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;html&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 9&lt;/strong&gt;, getting &lt;strong&gt;observable stream&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 13&lt;/strong&gt;, &lt;strong&gt;iterate&lt;/strong&gt; for each of the character of the text.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 22-27&lt;/strong&gt;, &lt;strong&gt;subscribe&lt;/strong&gt; to the event stream (for each of the character).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;the Rx framework is now available for web developers.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Learn More&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://channel9.msdn.com/posts/Charles/Introducing-RxJS-Reactive-Extensions-for-JavaScript/" target="_blank"&gt;RxJs on channel 9&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx" target="_blank"&gt;Download RxJs&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/self.aspx/Code%20Samples/Rx/Js/rx.js" target="_blank"&gt;Download rx.js&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/jeffva/archive/2010/03/17/reactive-extensions-for-javascript-the-time-flies-like-an-arrow-sample.aspx" target="_blank"&gt;walk through the RxJs sample in greater details (Jeffrey rambles)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f03%2f30%2frx-for-beginners-part-12-rxjs.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f03%2f30%2frx-for-beginners-part-12-rxjs.aspx" /&gt;&lt;/a&gt; &lt;a href="http://dotnetshoutout.com/Rx-for-beginners-part-12-RxJs-Export-Bnaya-Eshet"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fblogs.microsoft.co.il%2Fblogs%2Fbnaya%2Farchive%2F2010%2F03%2F30%2Frx-for-beginners-part-12-rxjs.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=567812" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx">CLR 4</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx">Rx</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx">IObserver</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx">Reactive Extensions</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx">Parallel</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx">IObservable</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/JavaScript/default.aspx">JavaScript</category></item><item><title>MEF for Beginner (Import from Xaml) - part 11</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/20/mef-for-beginner-import-from-xaml-part-11.aspx</link><pubDate>Sat, 20 Mar 2010 21:28:23 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:552959</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;MEF for Beginner (Import from Xaml) - part 11&lt;/h2&gt;  &lt;p&gt;this is the 11th post of the &lt;a href="http://mef.codeplex.com/"&gt;&lt;strong&gt;MEF&lt;/strong&gt;&lt;/a&gt; for Beginner series, the series &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx"&gt;TOC&lt;/a&gt; is available &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;this post will focus on &lt;strong&gt;Importing mef parts &lt;/strong&gt;directly from the &lt;strong&gt;Xaml&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/iStock_000005438250VerySmallXmXorl_0339C5C9.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Import, ImportMany, MEF, composition, CLR 4" border="0" alt="Import, ImportMany, MEF, composition, CLR 4" src="http://blogs.microsoft.co.il/blogs/bnaya/iStock_000005438250VerySmallXmXorl_thumb_2E6E3703.jpg" width="303" height="77" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;the code sample for this post is available &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%2011?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;assuming that we have the following &lt;strong&gt;exports&lt;/strong&gt;:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3c19987e-7cb2-4576-8452-1bb91342eeae" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DemoStrings&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;MyTag&amp;quot;&lt;/span&gt;)]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Text1 { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;Hello world&amp;quot;&lt;/span&gt;; } }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;MyTag&amp;quot;&lt;/span&gt;)]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Text2 { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;export using custom attribute&amp;quot;&lt;/span&gt;; } }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;NotMyTag&amp;quot;&lt;/span&gt;)]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Text3 { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;not included (Not My Tag contract)&amp;quot;&lt;/span&gt;; } }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;MyTag&amp;quot;&lt;/span&gt;)]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Text4 { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;Wpf markup extension&amp;quot;&lt;/span&gt;; } }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Text5 { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;not included (have no contract)&amp;quot;&lt;/span&gt;; } }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;we may want to have it &lt;strong&gt;import&lt;/strong&gt; into the &lt;strong&gt;Xaml&lt;/strong&gt; as follow:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8f4b3bb2-cced-4c46-9881-b1d7f42810a4" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Bnaya.Samples.MainWindow&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;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;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;mef&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;clr-namespace:Bnaya.Samples&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; Title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;MainWindow&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Height&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;350&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;525&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ListBox&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; DataContext&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;mef&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ImportManyStrings&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; MyTag}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;&lt;/span&gt; &lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;as you can see at &lt;strong&gt;line 8&lt;/strong&gt; the &lt;strong&gt;data context&lt;/strong&gt; is using special definition for &lt;strong&gt;importing&lt;/strong&gt; all &lt;strong&gt;exported&lt;/strong&gt; &lt;strong&gt;strings&lt;/strong&gt; that     &lt;br /&gt;define the their &lt;strong&gt;contract&lt;/strong&gt; as &lt;strong&gt;MyTag&lt;/strong&gt; (&lt;font color="#808080"&gt;looking at the &lt;strong&gt;exports&lt;/strong&gt; it will &lt;strong&gt;import&lt;/strong&gt; the exports at&lt;strong&gt; lines 4,6,10&lt;/strong&gt;&lt;/font&gt;).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;what should we have in order to achieve that functionality?&lt;/h5&gt;  &lt;p&gt;actually very little, all we have to do is to define a&lt;strong&gt; markup extension&lt;/strong&gt; that return the &lt;strong&gt;exported&lt;/strong&gt; &lt;strong&gt;parts&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the following code is how the &lt;strong&gt;markup extension&lt;/strong&gt; should be define:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ce4d674f-f189-46ff-82bc-0b4ea7447c79" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;MarkupExtensionReturnType&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;))]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ImportManyStringsExtension&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;MarkupExtension&lt;/span&gt;&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; _dataSource;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ImportManyStringsExtension(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; contract)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;_dataSource = &lt;span style="color:#2b91af;"&gt;CompositionHost&lt;/span&gt;.Provider.GetExportedValues&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;(contract);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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; ProvideValue(&lt;span style="color:#2b91af;"&gt;IServiceProvider&lt;/span&gt; serviceProvider)&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _dataSource;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&amp;#160;&amp;#160;&amp;#160;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 1&lt;/strong&gt;, decorate that our &lt;strong&gt;markup extension&lt;/strong&gt; for returning &lt;strong&gt;IEnumerable&amp;lt;string&amp;gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 2&lt;/strong&gt;, derive from &lt;strong&gt;MarkupExtension&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 7&lt;/strong&gt;, at the construction time, dynamically ask &lt;strong&gt;mef&lt;/strong&gt; for any &lt;strong&gt;discoverable parts&lt;/strong&gt; that follow the &lt;strong&gt;contract&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;the CompositionHost is a very small helper class that was taken from the &lt;strong&gt;MEF Silverlight&lt;/strong&gt; implementation &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;with some very minor enhancements&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 10-13&lt;/strong&gt;, returning the &lt;strong&gt;discoverable parts&lt;/strong&gt; to the &lt;strong&gt;Xaml&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;One last thing&lt;/h5&gt;  &lt;p&gt;we should remove the &lt;strong&gt;StartupUri&lt;/strong&gt; from the &lt;strong&gt;App.Xaml&lt;/strong&gt; and using the &lt;strong&gt;OnStartup override&lt;/strong&gt; instead:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a18e7edc-77f1-43b8-8db2-338a4a86aea3" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&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; OnStartup(&lt;span style="color:#2b91af;"&gt;StartupEventArgs&lt;/span&gt; e)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;.OnStartup(e);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color:#2b91af;"&gt;Utils&lt;/span&gt;.IsInDesignTool)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; asmCatalog = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AssemblyCatalog&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;App&lt;/span&gt;).Assembly);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; catalogs = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AggregateCatalog&lt;/span&gt;(asmCatalog);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; container = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CompositionContainer&lt;/span&gt;(catalogs);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;CompositionHost&lt;/span&gt;.Initialize(container);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;container.Compose(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CompositionBatch&lt;/span&gt;());&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; root = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MainWindow&lt;/span&gt;(); &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;root.ShowDialog();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;line 5&lt;/strong&gt;, preventing &lt;strong&gt;MEF&lt;/strong&gt; operation during&lt;strong&gt; design time&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 7-9&lt;/strong&gt;, setting the&lt;strong&gt; MEF container&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 10&lt;/strong&gt;, setting the &lt;strong&gt;MEF container&lt;/strong&gt; as the &lt;strong&gt;main container&lt;/strong&gt; of the application &lt;/p&gt;  &lt;p&gt;(this way it can be &lt;strong&gt;reachable anywhere&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 11&lt;/strong&gt;, do the &lt;strong&gt;composition&lt;/strong&gt;, &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;IMPOERANT&lt;/font&gt;&lt;/strong&gt;: the &lt;strong&gt;composition&lt;/strong&gt; should happens &lt;strong&gt;before&lt;/strong&gt; the &lt;strong&gt;window instantiation&lt;/strong&gt;, &lt;/p&gt;  &lt;p&gt;because that when the &lt;strong&gt;markup extension&lt;/strong&gt; will be invoke.&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;exported part&lt;/strong&gt; should be available at this time. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 13-14&lt;/strong&gt;, starting the application.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;we can extend the &lt;strong&gt;Xaml&lt;/strong&gt; very easily in order to get better &lt;strong&gt;Xaml&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Mef&lt;/strong&gt; experience.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the code sample for this post is available &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%2011?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1bd718e5-fd3d-4d99-80e3-d80d7f7d4f74" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/Import" rel="tag"&gt;Import&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ImportMany" rel="tag"&gt;ImportMany&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MEF" rel="tag"&gt;MEF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/composition" rel="tag"&gt;composition&lt;/a&gt;,&lt;a href="http://technorati.com/tags/CLR+4" rel="tag"&gt;CLR 4&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f03%2f20%2fmef-for-beginner-import-from-xaml-part-11.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f03%2f20%2fmef-for-beginner-import-from-xaml-part-11.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=552959" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx">MEF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Extensibility/default.aspx">Extensibility</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/extension/default.aspx">extension</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx">Composition</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ImportMany/default.aspx">ImportMany</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Export/default.aspx">Export</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Import/default.aspx">Import</category></item><item><title>Rx - for beginners (part 10): Concat expression</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/16/rx-for-beginners-part-10-concat-expression.aspx</link><pubDate>Tue, 16 Mar 2010 21:49:53 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:548256</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;/p&gt;  &lt;h2&gt;&lt;strong&gt;Rx&lt;/strong&gt; - for beginners (part 10): &lt;strong&gt;Concat&lt;/strong&gt; expression&lt;/h2&gt;  &lt;p&gt;&lt;img style="margin:0px 10px 0px 0px;" title="Rx, IObservable,IObserver" alt="Rx, IObservable,IObserver" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/1266073365_kghostview_6B15105E.jpg" width="57" height="57" /&gt;&lt;/p&gt;  &lt;p&gt;this post is the 10th in a series of posts about the new &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Reactive Framework&lt;/a&gt;&lt;/strong&gt; (&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Rx&lt;/a&gt;&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;the series TOC can found &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-toc.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;in this post we will focus on the &lt;strong&gt;Concat&lt;/strong&gt; expression.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the code for this post can be download from &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%2010?uc=1&amp;amp;isFromRichUpload=1"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;h6&gt;&lt;/h6&gt;  &lt;h6&gt;&amp;#160;&lt;/h6&gt;  &lt;h5&gt;What does it do?&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;Concat&lt;/strong&gt; expression is used to concatenate one &lt;strong&gt;Observable&lt;/strong&gt; stream&lt;/p&gt;  &lt;p&gt;into the end of another &lt;strong&gt;Observable&lt;/strong&gt; stream.&lt;/p&gt;  &lt;p&gt;once the first &lt;strong&gt;Observable&lt;/strong&gt; stream is completed the the concat stream will be immediate subscribed.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the&lt;strong&gt; marble diagrams&lt;/strong&gt; of &lt;strong&gt;Concat&lt;/strong&gt; expression will look as follow:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_032B1F1B.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_463651AE.png" width="498" height="276" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;the result &lt;strong&gt;observable&lt;/strong&gt; stream will &lt;strong&gt;subscribe&lt;/strong&gt; to the yStream &lt;strong&gt;after&lt;/strong&gt; the xStream is &lt;strong&gt;completed&lt;/strong&gt;,&lt;/p&gt;  &lt;p&gt;therefore any values on the yStream before the &lt;strong&gt;subscription&lt;/strong&gt; will be ignored.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;in case of &lt;strong&gt;exception&lt;/strong&gt; on any of the &lt;strong&gt;Concat&lt;/strong&gt; &lt;strong&gt;Observable&lt;/strong&gt; streams the &lt;strong&gt;marble diagrams&lt;/strong&gt; will look as follow:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_3A60BEE2.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_0F58AB10.png" width="496" height="230" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_519B9D86.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_54ED0F61.png" width="495" height="231" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Code sample&lt;/h5&gt;  &lt;p&gt;the code for this post can be download from &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%2010?uc=1&amp;amp;isFromRichUpload=1"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;Helper method for creating interval stream (based on System.Timers.Timer event):&lt;/h6&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3db4553c-e01d-4c88-89c1-a9cf8cb9cf20" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; System.Timers.&lt;span style="color:#2b91af;"&gt;Timer&lt;/span&gt; s_timer = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Timers.&lt;span style="color:#2b91af;"&gt;Timer&lt;/span&gt;(1000);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&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:#2b91af;"&gt;IObservable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; CreateObservable(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; prefix,&lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt; stopAt)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; eventStream = &lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.FromEvent&amp;lt;&lt;span style="color:#2b91af;"&gt;ElapsedEventArgs&lt;/span&gt;&amp;gt;(s_timer,&lt;span style="color:#a31515;"&gt;&amp;quot;Elapsed&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; startTime = &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; stopTime = startTime + stopAt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IEvent&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ElapsedEventArgs&lt;/span&gt;&amp;gt;,&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt;&amp;gt; stopPredicate =&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;value =&amp;gt; value.EventArgs.SignalTime &amp;lt; stopTime;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IEvent&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ElapsedEventArgs&lt;/span&gt;&amp;gt;,&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; selectFormatter =&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;value =&amp;gt; prefix + (value.EventArgs.SignalTime - startTime).TotalSeconds.ToString(&lt;span style="color:#a31515;"&gt;&amp;quot;N0&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; obs = eventStream.TakeWhile(stopPredicate).Select(selectFormatter);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; obs;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;Line 1&lt;/strong&gt;, create instance of the timer.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Line 3&lt;/strong&gt;, the method get 2 parameters:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;prefix&lt;/strong&gt;: which is used to format the stream output (&lt;strong&gt;line 13&lt;/strong&gt;). &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;stop at&lt;/strong&gt;: which will define the stream &lt;strong&gt;lifetime&lt;/strong&gt; duration. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;line 5&lt;/strong&gt;, create&lt;strong&gt; observable&lt;/strong&gt; stream out of the &lt;strong&gt;timer elapsed&lt;/strong&gt; event (we can use this technique on any .NET event).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 10-11&lt;/strong&gt;, is the &lt;strong&gt;stop predicate&lt;/strong&gt; which is used by the &lt;strong&gt;TakeWhile&lt;/strong&gt; at &lt;strong&gt;line 15.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 12-13&lt;/strong&gt;, is the &lt;strong&gt;output formatting&lt;/strong&gt; which is used by the &lt;strong&gt;Select&lt;/strong&gt; at &lt;strong&gt;line 15&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the main method is look as follow:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c805fcfa-78b4-46c7-991e-13994f91b4cd" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; xs = CreateObservable(&lt;span style="color:#a31515;"&gt;&amp;quot;X&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(3.5));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; ys = CreateObservable(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#160;&amp;#160;Y&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(10));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;xs.Subscribe (value =&amp;gt; {&lt;span style="color:#008000;"&gt;/* do nothing */}&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;() =&amp;gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ForegroundColor = &lt;span style="color:#2b91af;"&gt;ConsoleColor&lt;/span&gt;.Gray;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;xs Completed&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ForegroundColor = &lt;span style="color:#2b91af;"&gt;ConsoleColor&lt;/span&gt;.White;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;});&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; combineLatestStream = xs.Concat(ys);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ForegroundColor = &lt;span style="color:#2b91af;"&gt;ConsoleColor&lt;/span&gt;.White;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;combineLatestStream.Subscribe(value =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(value),() =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Completed&amp;quot;&lt;/span&gt;));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;s_timer.Start();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ReadKey();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;line 3&lt;/strong&gt;, create &lt;strong&gt;observable&lt;/strong&gt; stream with lifetime period of &lt;strong&gt;3.5 seconds&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lime 4&lt;/strong&gt;, create &lt;strong&gt;observable&lt;/strong&gt; stream with lifetime period of &lt;strong&gt;10 seconds&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 6-12&lt;/strong&gt;, &lt;strong&gt;subscribing&lt;/strong&gt; the the complete event of the &lt;strong&gt;xs&lt;/strong&gt; stream.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 14&lt;/strong&gt;, C&lt;strong&gt;oncat&lt;/strong&gt; the streams.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 17&lt;/strong&gt;, &lt;strong&gt;subscribe&lt;/strong&gt; to to &lt;strong&gt;concat output&lt;/strong&gt; stream.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 18&lt;/strong&gt;, start the timer so the streams will start to produce values.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the output will look as follow:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_4FDAABE5.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_5253B7D6.png" width="240" height="193" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;you may notice that Y4 value is missing.&lt;/p&gt;  &lt;p&gt;the reason for it is that the &lt;strong&gt;complete&lt;/strong&gt; event occur at the 4th timer elapse event, &lt;/p&gt;  &lt;p&gt;and only then the &lt;strong&gt;subscription&lt;/strong&gt; to the ys stream was taking place so nobody was yet listening &lt;/p&gt;  &lt;p&gt;to the ys stream when the 4th timer elapsed.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;Concat&lt;/strong&gt; can join 2 observable stream, but unlike &lt;strong&gt;Merge&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;it doesn&amp;#39;t listen on both streams simultaneously.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:51f107c3-cd88-47c5-a10b-824f3c074b74" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/Rx" rel="tag"&gt;Rx&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IObservable" rel="tag"&gt;IObservable&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IObserver" rel="tag"&gt;IObserver&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f03%2f16%2frx-for-beginners-part-10-concat-expression.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f03%2f16%2frx-for-beginners-part-10-concat-expression.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=548256" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx">CLR 4</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx">Rx</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx">IObserver</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx">Reactive Extensions</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx">Parallel</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx">IObservable</category></item><item><title>Rx - for beginners (part 8): Combine Latest expression</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/10/rx-for-beginners-part-8-combine-latest-expression.aspx</link><pubDate>Wed, 10 Mar 2010 23:32:27 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:540685</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;&lt;strong&gt;Rx&lt;/strong&gt; - for beginners (part 8): &lt;strong&gt;Combine Latest&lt;/strong&gt; expression&lt;/h2&gt;  &lt;p&gt;&lt;img style="margin:0px 10px 0px 0px;display:inline;" title="Rx, IObservable,IObserver" alt="Rx, IObservable,IObserver" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/1266073365_kghostview_6B15105E.jpg" width="57" height="57" /&gt;&lt;/p&gt;  &lt;p&gt;this post is the 8th in a series of posts about the new &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Reactive Framework&lt;/a&gt;&lt;/strong&gt; (&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Rx&lt;/a&gt;&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;the series TOC can found &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-toc.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;in this post we will focus on the &lt;strong&gt;Combine Latest&lt;/strong&gt; expression.&lt;/p&gt;  &lt;p&gt;the code for this post can be download from &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%208?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;&lt;/h6&gt;  &lt;h5&gt;What does it do?&lt;/h5&gt;  &lt;p&gt;like the &lt;strong&gt;zip&lt;/strong&gt; expression the &lt;strong&gt;Combine Latest&lt;/strong&gt; expression is used to synchronize&lt;/p&gt;  &lt;p&gt;2 &lt;strong&gt;IObservable&lt;/strong&gt; streams into single &lt;strong&gt;IObservable&lt;/strong&gt; stream.&lt;/p&gt;  &lt;p&gt;unlike the &lt;strong&gt;zip&lt;/strong&gt; expression the &lt;strong&gt;Combine Latest&lt;/strong&gt; doesn&amp;#39;t using queue,&lt;/p&gt;  &lt;p&gt;as it name suggest it only remember the latest value of each stream.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;What is the combination strategy?&lt;/h5&gt;  &lt;p&gt;the strategy used by the &lt;strong&gt;Combine Latest&lt;/strong&gt; is to observe both stream, and each time &lt;/p&gt;  &lt;p&gt;it new value &lt;strong&gt;observed&lt;/strong&gt; on either of the stream it &lt;strong&gt;combine&lt;/strong&gt; it with the &lt;strong&gt;latest&lt;/strong&gt; value observed on the other stream.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the&lt;strong&gt; marble diagrams&lt;/strong&gt; of &lt;strong&gt;Combine Latest&lt;/strong&gt; expression will look as follow:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_313D0278.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_1CA78D2D.png" width="494" height="237" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;we can see that when the &lt;strong&gt;y stream&lt;/strong&gt; observed the&lt;strong&gt; b &lt;/strong&gt;value, the &lt;strong&gt;result stream &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;combine&lt;/strong&gt; it with the &lt;strong&gt;latest&lt;/strong&gt; value observed on &lt;strong&gt;x stream&lt;/strong&gt; (3) and latter the same value&lt;/p&gt;  &lt;p&gt;will be &lt;strong&gt;combine&lt;/strong&gt; into the result stream when the &lt;strong&gt;x stream&lt;/strong&gt; will &lt;strong&gt;observed&lt;/strong&gt; the &lt;strong&gt;4&lt;/strong&gt; value.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;When does it halt?&lt;/h6&gt;  &lt;p&gt;the &lt;strong&gt;Combine Latest&lt;/strong&gt; processing will come to end either when one of the stream &lt;/p&gt;  &lt;p&gt;will &lt;strong&gt;complete&lt;/strong&gt; or &lt;strong&gt;throw exception&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_4FE1718F.png"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h5&gt;Code sample&lt;/h5&gt;  &lt;p&gt;the code for this post can be download from &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%208?uc=1&amp;amp;isFromRichUpload=1"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;Helper method for creating interval stream:&lt;/h6&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:feb7f54a-b717-485a-a649-98375d70e36b" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&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:#2b91af;"&gt;IObservable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; CreateObservable(&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; prefix,&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; stopAt, &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; secondsInterval)&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; inteval = &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(secondsInterval);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; eventStream = &lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.Interval(inteval).&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;TakeWhile(value =&amp;gt; value &amp;lt; stopAt).&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Select(value =&amp;gt; prefix + value.ToString());&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; eventStream;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;the method &lt;strong&gt;parameters&lt;/strong&gt; include (&lt;strong&gt;line 2&lt;/strong&gt;):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;prefix&lt;/strong&gt;: just so we can &lt;strong&gt;distinguish values&lt;/strong&gt; that was created by one stream from       &lt;br /&gt;values created on the other (see &lt;strong&gt;line 7&lt;/strong&gt;). &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;stop&lt;/strong&gt; &lt;strong&gt;at&lt;/strong&gt;: define how many &lt;strong&gt;values&lt;/strong&gt; will be produce by the stream &lt;strong&gt;before complete&lt;/strong&gt; (see &lt;strong&gt;line 6&lt;/strong&gt;). &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;seconds&lt;/strong&gt; &lt;strong&gt;interval&lt;/strong&gt;: define the &lt;strong&gt;frequency&lt;/strong&gt; that the stream produce values (see&lt;strong&gt; lines 4,5&lt;/strong&gt;) &lt;/li&gt; &lt;/ul&gt;  &lt;h6&gt;The main method is looking as follow:&lt;/h6&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e7ac6662-2b8f-4321-a46c-a7f6e687c91c" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; xs = CreateObservable(&lt;span style="color:#a31515;"&gt;&amp;quot;X&amp;quot;&lt;/span&gt;,15, 0.5);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; ys = CreateObservable(&lt;span style="color:#a31515;"&gt;&amp;quot;Y&amp;quot;&lt;/span&gt;,2, 2);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; combineLatestStream = xs.CombineLatest(ys, (x,y) =&amp;gt; x + &lt;span style="color:#a31515;"&gt;&amp;quot; : &amp;quot;&lt;/span&gt; + y);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;combineLatestStream.Subscribe(value =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(value),() =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Completed&amp;quot;&lt;/span&gt;));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ReadKey();&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;line 3&lt;/strong&gt;, create stream which will produce &lt;strong&gt;15 values&lt;/strong&gt; before completion at &lt;strong&gt;frequency&lt;/strong&gt; of&lt;strong&gt; 0.5&lt;/strong&gt; seconds.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 4&lt;/strong&gt;, create stream which will produce &lt;strong&gt;2&lt;/strong&gt; &lt;strong&gt;values&lt;/strong&gt; before completion at &lt;strong&gt;frequency&lt;/strong&gt; of&lt;strong&gt; 2 &lt;/strong&gt;seconds.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 6&lt;/strong&gt;, is c&lt;strong&gt;ombine &lt;/strong&gt;both streams, the &lt;strong&gt;Lamda&lt;/strong&gt; is using to &lt;strong&gt;concatenate &lt;/strong&gt;both stream&amp;#39;s values.&lt;/p&gt;  &lt;p&gt;The result will look as follow:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_0624C8D9.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_0EC52165.png" width="173" height="215" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;&amp;#160;&lt;/h5&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;Combine Latest&lt;/strong&gt; expression can be used to synchronize 2 streams,&lt;/p&gt;  &lt;p&gt;while the output stream will get notified when ever either of the stream produce new value.&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:616979b9-7d5b-468d-aa6f-85f23932b3d3" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/Rx" rel="tag"&gt;Rx&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IObservable" rel="tag"&gt;IObservable&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IObserver" rel="tag"&gt;IObserver&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f03%2f10%2frx-for-beginners-part-8-combine-latest-expression.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f03%2f10%2frx-for-beginners-part-8-combine-latest-expression.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=540685" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx">CLR 4</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx">Rx</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx">IObserver</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx">Reactive Extensions</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx">Parallel</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx">IObservable</category></item><item><title>Rx - for beginners (part 7): Zip expression</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/05/rx-for-beginners-part-7-zip-expression.aspx</link><pubDate>Fri, 05 Mar 2010 06:43:23 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:534514</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h4&gt;Rx - for beginners (part 7): &lt;strong&gt;Zip&lt;/strong&gt; expression&lt;/h4&gt;  &lt;p&gt;this post is the 7th in a series of posts about the new &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Reactive Framework&lt;/a&gt;&lt;/strong&gt; (&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Rx&lt;/a&gt;&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;the series TOC can found &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-toc.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1267738172_zip2_5A268421.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/1267738172_zip2_thumb_517605C8.jpg" width="120" height="108" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;in this post we will focus on the &lt;strong&gt;Zip &lt;/strong&gt;expression.&lt;/p&gt;  &lt;p&gt;the code for this post can be download from &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%207?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h6&gt;&amp;#160;&lt;/h6&gt;  &lt;h5&gt;What does it do?&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;zip&lt;/strong&gt; expression is used to synchronize 2 &lt;strong&gt;IObservable&lt;/strong&gt; streams into single &lt;strong&gt;IObservable&lt;/strong&gt; stream.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;How does it do it?&lt;/h5&gt;  &lt;p&gt;it is taking the &lt;strong&gt;first&lt;/strong&gt; &lt;strong&gt;observed&lt;/strong&gt; &lt;strong&gt;value&lt;/strong&gt; on either of the stream and &lt;strong&gt;wait&lt;/strong&gt; &lt;strong&gt;for&lt;/strong&gt; value from the &lt;strong&gt;other stream&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;after both stream produce a value, the &lt;strong&gt;zip&lt;/strong&gt; will &lt;strong&gt;project&lt;/strong&gt; the value &lt;strong&gt;combination&lt;/strong&gt;, &lt;/p&gt;  &lt;p&gt;then it will &lt;strong&gt;wait&lt;/strong&gt; for the &lt;strong&gt;next couple&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;What happens when the stream frequency is not equals?&lt;/h5&gt;  &lt;p&gt;if one of the stream &lt;strong&gt;produce&lt;/strong&gt; values &lt;strong&gt;more frequently&lt;/strong&gt; than the other, those &lt;strong&gt;values&lt;/strong&gt; will be &lt;strong&gt;queue&lt;/strong&gt; in memory&lt;/p&gt;  &lt;p&gt;and each time that the &lt;strong&gt;slower&lt;/strong&gt; stream will &lt;strong&gt;produce&lt;/strong&gt; a value, a single value will be &lt;strong&gt;fetched out&lt;/strong&gt; of the fast stream&amp;#39;s &lt;strong&gt;queue,&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;and &lt;strong&gt;combined&lt;/strong&gt; with the slower stream&amp;#39;s value.&lt;/p&gt;  &lt;p&gt;&lt;font color="#404040"&gt;that mean that you should be aware for possibly side effects, in terms of memory usages&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the&lt;strong&gt; marble diagrams&lt;/strong&gt; of &lt;strong&gt;zip &lt;/strong&gt;expression will look as follow:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_4186C104.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_25295917.png" width="537" height="257" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;h5&gt;When does it halt?&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;zip&lt;/strong&gt; processing will come to &lt;strong&gt;end&lt;/strong&gt; either when one of the stream &lt;/p&gt;  &lt;p&gt;will &lt;strong&gt;complete&lt;/strong&gt; or when either of the stream will &lt;strong&gt;throw exception&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;…..&lt;/p&gt;  &lt;p&gt;actually it is a bit more complex,&lt;/p&gt;  &lt;p&gt;when one of the&amp;#160; stream &lt;strong&gt;complete&lt;/strong&gt;, and still having value within the &lt;strong&gt;queued&lt;/strong&gt;, &lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;complete&lt;/strong&gt; notification will be put &lt;strong&gt;into&lt;/strong&gt; the &lt;strong&gt;queue&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;which mean that the &lt;strong&gt;actual complete&lt;/strong&gt; will take place only the &lt;strong&gt;queue become dry&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;or when the other stream will notify completion.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;marble diagram&lt;/strong&gt; for this scenario will look as follow:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_4A8326B8.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_673C9BCD.png" width="547" height="262" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;if either of the stream is &lt;strong&gt;throwing exception&lt;/strong&gt; the exception will &lt;strong&gt;immediately&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;project into the result stream and &lt;strong&gt;halt&lt;/strong&gt; the &lt;strong&gt;zip&lt;/strong&gt; operation.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_4FE1718F.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_6C9AE6A4.png" width="551" height="264" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Code sample&lt;/h5&gt;  &lt;p&gt;the code for this post can be download from &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%207?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;Helper method for creating interval stream:&lt;/h6&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:716420ca-7f77-4fd9-a8c4-ddc94bab2e4e" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&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:#2b91af;"&gt;IObservable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; CreateObservable(&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; prefix,&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; stopAt, &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; secondsInterval)&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; inteval = &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(secondsInterval);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; eventStream = &lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.Interval(inteval).&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;TakeWhile(value =&amp;gt; value &amp;lt; stopAt).&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Select(value =&amp;gt; prefix + value.ToString());&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; eventStream;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;the method &lt;strong&gt;parameters&lt;/strong&gt; include (&lt;strong&gt;line 2&lt;/strong&gt;):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;prefix&lt;/strong&gt;: just so we can &lt;strong&gt;distinguish values&lt;/strong&gt; that was created by one stream from       &lt;br /&gt;values created on the other (see &lt;strong&gt;line 7&lt;/strong&gt;). &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;stop&lt;/strong&gt; &lt;strong&gt;at&lt;/strong&gt;: define how many &lt;strong&gt;values&lt;/strong&gt; will be produce by the stream &lt;strong&gt;before complete&lt;/strong&gt; (see &lt;strong&gt;line 6&lt;/strong&gt;). &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;seconds&lt;/strong&gt; &lt;strong&gt;interval&lt;/strong&gt;: define the &lt;strong&gt;frequency&lt;/strong&gt; that the stream produce values (see&lt;strong&gt; lines 4,5&lt;/strong&gt;) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;The main method is looking as follow:&lt;/h6&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c5f52f92-d3cb-4868-84f7-485846838f5c" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; xs = CreateObservable(&lt;span style="color:#a31515;"&gt;&amp;quot;X&amp;quot;&lt;/span&gt;,5, 0.1);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; ys = CreateObservable(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#160;&amp;#160;&amp;#160;Y&amp;quot;&lt;/span&gt;,3, 1);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; zippedStream = xs.Zip (ys, (x, y) =&amp;gt; x + &lt;span style="color:#a31515;"&gt;&amp;quot; : &amp;quot;&lt;/span&gt; + y);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;zippedStream.Subscribe(value =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(value),() =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Complete&amp;quot;&lt;/span&gt;));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ReadKey();&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;line 3&lt;/strong&gt;, create stream which will produce &lt;strong&gt;5 values&lt;/strong&gt; before completion at &lt;strong&gt;frequency&lt;/strong&gt; of&lt;strong&gt; 0.1&lt;/strong&gt; seconds.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 4&lt;/strong&gt;, create stream which will produce &lt;strong&gt;3&lt;/strong&gt; &lt;strong&gt;values&lt;/strong&gt; before completion at &lt;strong&gt;frequency&lt;/strong&gt; of&lt;strong&gt; 1 &lt;/strong&gt;seconds.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 6&lt;/strong&gt;, is &lt;strong&gt;zipping&lt;/strong&gt; both streams, the &lt;strong&gt;Lamda&lt;/strong&gt; is using to &lt;strong&gt;concatenate &lt;/strong&gt;both stream&amp;#39;s values.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The result will look as follow:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_6EA7BFA0.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_5E4C47E7.png" width="189" height="143" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;Zip expression can be used to synchronize 2 streams,&lt;/p&gt;  &lt;p&gt;but we should be carful of possible memory side effects.&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:db36168c-b7c1-44ce-a811-3bf0d057b9a1" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/Rx" rel="tag"&gt;Rx&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IObservable" rel="tag"&gt;IObservable&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IObserver" rel="tag"&gt;IObserver&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f03%2f05%2frx-for-beginners-part-7-zip-expression.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f03%2f05%2frx-for-beginners-part-7-zip-expression.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=534514" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx">CLR 4</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx">Rx</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx">IObserver</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx">Reactive Extensions</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx">IObservable</category></item><item><title>Rx - for beginners (part 6): Merge expression</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/02/rx-for-beginners-part-6-merge-expression.aspx</link><pubDate>Wed, 03 Mar 2010 02:46:41 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:532657</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;Rx - for beginners (part 6): &lt;strong&gt;Merge&lt;/strong&gt; expression&lt;/h2&gt;  &lt;p&gt;this post is the 6th in a series of posts about the new &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Reactive Framework&lt;/a&gt;&lt;/strong&gt; (&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Rx&lt;/a&gt;&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;the series TOC can found &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img title="Rx, IObservable,IObserver" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/1266073365_kghostview_6B15105E.jpg" width="107" height="107" /&gt;&lt;/p&gt;  &lt;p&gt;in this post we will focus on the &lt;strong&gt;Merge&lt;/strong&gt; expression.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;What does it do?&lt;/h5&gt;  &lt;p&gt;the merge expression is used to &lt;strong&gt;merge&lt;/strong&gt; multiple &lt;strong&gt;IObservable&lt;/strong&gt; streams into single &lt;strong&gt;IObservable&lt;/strong&gt; streams.&lt;/p&gt;  &lt;p&gt;the&lt;strong&gt; marble diagrams&lt;/strong&gt; of &lt;strong&gt;merge&lt;/strong&gt; expression will look as follow:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_2ED3333E.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_6E8CF3F6.png" width="488" height="226" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;each value on the source streams is project into the result stream until all &lt;/p&gt;  &lt;p&gt;the source streams complete.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;if one of the stream &lt;strong&gt;raise exception&lt;/strong&gt; the &lt;strong&gt;error&lt;/strong&gt; will be &lt;strong&gt;project&lt;/strong&gt; into the&lt;strong&gt; result stream&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;and &lt;strong&gt;dispose&lt;/strong&gt; the &lt;strong&gt;subscriptions&lt;/strong&gt; (the result stream will stop listening to any of the streams).&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;marble diagram&lt;/strong&gt; for this case will look as follow:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_4A37E9A7.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_46D651FF.png" width="489" height="222" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Code Sample&lt;/h5&gt;  &lt;p&gt;the code sample can be download from &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%206?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the sample for this post is merging 3 streams that is running on different time interval&lt;/p&gt;  &lt;p&gt;into one stream.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:70c93a92-0f88-4f0f-a0c1-98694d9d5001" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&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:#2b91af;"&gt;IObservable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; CreateObservable(&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; prefix,&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; stopAt, &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; secondsInterval)&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; inteval = &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(secondsInterval);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; eventStream = &lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.Interval(inteval).&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;TakeWhile(value =&amp;gt; value &amp;lt; stopAt).&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Select(value =&amp;gt; prefix + value.ToString());&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; eventStream;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;the code is using the &lt;strong&gt;CreateObservable&lt;/strong&gt; method in order to create each of the &lt;strong&gt;source stream&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 5&lt;/strong&gt;, &lt;strong&gt;Observable.Interval&lt;/strong&gt; is creating stream with increasing value for each interval.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 6&lt;/strong&gt;, is stopping the after stopAt iterations.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 7&lt;/strong&gt;, formatting the value of the stream to string with prefix and the interval value.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the main method is looking as follow:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e5f9c029-cf2b-40f1-ac59-04581314da16" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; xs = CreateObservable(&lt;span style="color:#a31515;"&gt;&amp;quot;X&amp;quot;&lt;/span&gt;,5, 0.3);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; ys = CreateObservable(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#160;&amp;#160;&amp;#160;Y&amp;quot;&lt;/span&gt;,2, 1);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; zs = CreateObservable(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Z&amp;quot;&lt;/span&gt;,7, 0.6);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;//var mergedStream = xs.Merge(ys).Merge(zs);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; mergedStream = &lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.Merge(xs,ys,zs);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;mergedStream.Subscribe(value =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(value));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ReadKey();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Lines 3-5&lt;/strong&gt;, creating source streams.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 8&lt;/strong&gt;, creating the merged stream.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line9&lt;/strong&gt;, subscribe to the merged stream.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the following is the output:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_4CED78CD.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_10E13718.png" width="143" height="240" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;Merge is exactly what we expected, any value of the source streams will be project&lt;/p&gt;  &lt;p&gt;into the&amp;#160; result stream unless exception occurs.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:adb60a9f-b92a-4dbf-9eb4-dbd07568eaae" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/Rx" rel="tag"&gt;Rx&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IObservable" rel="tag"&gt;IObservable&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IObserver" rel="tag"&gt;IObserver&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f03%2f02%2frx-for-beginners-part-6-merge-expression.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f03%2f02%2frx-for-beginners-part-6-merge-expression.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=532657" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx">Rx</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx">IObserver</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx">Reactive Extensions</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx">Parallel</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx">IObservable</category></item><item><title>Rx - for beginners (part 5): marble diagrams, select and where</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/28/rx-for-beginners-part-5-marble-diagrams-select-and-where.aspx</link><pubDate>Mon, 01 Mar 2010 02:24:40 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:530507</guid><dc:creator>bnaya</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Rx - for beginners (part 5): marble diagrams, select and where&lt;/p&gt;  &lt;p&gt;this post is the 5th in a series of posts about the new &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Reactive Framework&lt;/a&gt;&lt;/strong&gt; (&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Rx&lt;/a&gt;&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;the series TOC can found &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img title="Rx, IObservable,IObserver" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/1266073365_kghostview_6B15105E.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;this post will focus on &lt;strong&gt;marble diagrams&lt;/strong&gt; which is used for &lt;strong&gt;visualizing&lt;/strong&gt; &lt;strong&gt;IObservable stream&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;on this post we will visualize the &lt;strong&gt;select&lt;/strong&gt; and &lt;strong&gt;where&lt;/strong&gt; clause, while in the&lt;/p&gt;  &lt;p&gt;upcoming posts we will discuss other operations that can be &lt;/p&gt;  &lt;p&gt;used to upon &lt;strong&gt;IObservable&lt;/strong&gt; &lt;strong&gt;streams&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%205?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;code sample&lt;/a&gt; for this post is available &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%205?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;What should we visualize?&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;event stream&lt;/strong&gt; should &lt;strong&gt;visualize&lt;/strong&gt; the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;on next&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;on error&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;on complete&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_521819A6.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_73D3CC6A.png" width="460" height="98" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_5BECE544.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_75083F7C.png" width="458" height="98" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;How should we read the diagram?&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;marble diagram&lt;/strong&gt; can have one or more horizontal line.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;each &lt;strong&gt;horizontal line&lt;/strong&gt; present the &lt;strong&gt;timeline&lt;/strong&gt; of single &lt;strong&gt;IObservable&lt;/strong&gt; stream. &lt;/li&gt;    &lt;li&gt;the &lt;strong&gt;ellipse&lt;/strong&gt; present single occurrence of new value event (&lt;strong&gt;on next&lt;/strong&gt;). &lt;/li&gt;    &lt;li&gt;the &lt;strong&gt;vertical line&lt;/strong&gt; present the end of the stream sequence (&lt;strong&gt;on complete&lt;/strong&gt;).&amp;#160; &lt;/li&gt;    &lt;li&gt;the &lt;strong&gt;X sign&lt;/strong&gt; present exception (&lt;strong&gt;on error&lt;/strong&gt;). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font color="#800000"&gt;The&lt;strong&gt; hidden assumption&lt;/strong&gt; used by the&lt;strong&gt; Rx&lt;/strong&gt; framework is that the &lt;strong&gt;IObservable stream&lt;/strong&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#800000"&gt;should &lt;strong&gt;stop&lt;/strong&gt; either &lt;strong&gt;on complete&lt;/strong&gt; or &lt;strong&gt;on error&lt;/strong&gt;&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;How can we draw &lt;strong&gt;select&lt;/strong&gt; clause using the &lt;strong&gt;marble diagram&lt;/strong&gt;?&lt;/h5&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:db908ec8-7bd0-4e38-a7d9-8e11db37db72" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;// Create IObservable that has increasing long value each second &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; timeStream = &lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.Interval(&lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(1));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;// invert the timeStream stream using Linq statement&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; negativeTimeStream = &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; value &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; timeStream&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; -value;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;negativeTimeStream.Subscribe(value =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(value));&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;line 2&lt;/strong&gt;, creating &lt;strong&gt;IObservable&lt;/strong&gt; &lt;strong&gt;stream&lt;/strong&gt; that increment the projected value &lt;strong&gt;each second&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 5&lt;/strong&gt;, is using &lt;strong&gt;Linq&lt;/strong&gt; statement to convert the stream into negative value.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 8,&lt;/strong&gt; &lt;strong&gt;subscribe&lt;/strong&gt; to the stream and write it to the console.&lt;/p&gt;  &lt;p&gt;the result is shown in the following image.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_4927C5C0.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_31AD118F.png" width="185" height="219" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;marble diagrams&lt;/strong&gt; for the above snippet will look like the following diagram:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_3FDB64B2.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_6A671FC2.png" width="499" height="206" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;marble diagrams&lt;/strong&gt; show the construction of new &lt;strong&gt;IObservable&lt;/strong&gt; &lt;strong&gt;stream&lt;/strong&gt; using the &lt;strong&gt;select&lt;/strong&gt; operation.&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;vertical arrow&lt;/strong&gt; present the &lt;strong&gt;transition&lt;/strong&gt; from the &lt;strong&gt;source&lt;/strong&gt; stream into the &lt;strong&gt;destination&lt;/strong&gt; stream.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;as the case with &lt;strong&gt;IEnumerable&lt;/strong&gt; the &lt;strong&gt;select&lt;/strong&gt; statement is extension method which &lt;/p&gt;  &lt;p&gt;can be used on any &lt;strong&gt;IObservable stream,&lt;/strong&gt; we will get same result for the following code:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1c8ef079-f852-4d5d-9830-114a269f2649" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; negativeTimeStream = timeStream.Select(value =&amp;gt; -value);&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Where clause &lt;strong&gt;marble diagram&lt;/strong&gt;?&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;where&lt;/strong&gt; clause of the following snippet:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:446e5679-5c2f-451a-b0d0-19999d6b4bbd" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;// taking only even values&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;//var evenTimeStream = timeStream.Where(value =&amp;gt; value % 2 == 0);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; evenTimeStream = &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; value &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; timeStream&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; value % 2 == 0&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; value;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;will be present:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_17B88FC6.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObservable,IObserver" border="0" alt="Rx, IObservable,IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_5C188105.png" width="480" height="120" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;marble diagrams&lt;/strong&gt; is how stream manipulation can be visualize.&lt;/p&gt;  &lt;p&gt;we already surveyed the &lt;strong&gt;select&lt;/strong&gt; and &lt;strong&gt;where&lt;/strong&gt; operations, and we will continue &lt;/p&gt;  &lt;p&gt;with other operation in the upcoming posts.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Code Samples&lt;/h5&gt;  &lt;p&gt;the &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%205?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;code sample&lt;/a&gt; for this post is available &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%205?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:cb1ea792-9fb6-49cd-8827-30c17517a3a7" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/Rx" rel="tag"&gt;Rx&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IObservable" rel="tag"&gt;IObservable&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IObserver" rel="tag"&gt;IObserver&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f02%2f28%2frx-for-beginners-part-5-marble-diagrams-select-and-where.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f02%2f28%2frx-for-beginners-part-5-marble-diagrams-select-and-where.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=530507" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx">CLR 4</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx">Rx</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx">IObserver</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx">Reactive Extensions</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx">Parallel</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx">IObservable</category></item><item><title>Rx - for beginners (part 4): anonymous observer handler</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/26/rx-for-beginners-part-4-anonymous-observer-handler.aspx</link><pubDate>Fri, 26 Feb 2010 21:04:12 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:529188</guid><dc:creator>bnaya</dc:creator><slash:comments>1</slash:comments><description>&lt;h4&gt;&lt;strong&gt;Rx&lt;/strong&gt; - for beginners (part 4): &lt;strong&gt;anonymous observer&lt;/strong&gt; handler&lt;/h4&gt;  &lt;p&gt;this post is the 4th in a series of posts about the new &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Reactive Framework&lt;/a&gt;&lt;/strong&gt; (&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Rx&lt;/a&gt;&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;the series TOC can found &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;this post will focus on &lt;strong&gt;anonymous observer&lt;/strong&gt; handler.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_6975CCB1.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, IObserver, IObservable" border="0" alt="Rx, IObserver, IObservable" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_178F7CD2.png" width="132" height="132" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;the code sample for this post can be download from &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%204?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Anonymous Observer&lt;/h5&gt;  &lt;p&gt;as we mention on the previous posts, &lt;strong&gt;IObserver&lt;/strong&gt; is used as a &lt;strong&gt;callback&lt;/strong&gt; interface&lt;/p&gt;  &lt;p&gt;which can be &lt;strong&gt;subscribe&lt;/strong&gt; to the &lt;strong&gt;IObservable&lt;/strong&gt;, &lt;/p&gt;  &lt;p&gt;but this is a bit of overkill, when what we &lt;strong&gt;subscribe&lt;/strong&gt; is relatively small (&lt;font color="#404040"&gt;like Console.Write&lt;/font&gt;).&lt;/p&gt;  &lt;p&gt;wouldn&amp;#39;t it be nice to use &lt;strong&gt;Lamda&lt;/strong&gt; expression instead?&lt;/p&gt;  &lt;p&gt;doesn&amp;#39;t we want to have something &lt;strong&gt;similar&lt;/strong&gt; to &lt;strong&gt;button1.Click += (s,e)=&amp;gt;Console.WriteLine(…);&lt;/strong&gt; .&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;&lt;strong&gt;IObservable&lt;/strong&gt; extensions&lt;/h5&gt;  &lt;p&gt;using &lt;strong&gt;Lamda&lt;/strong&gt; expression syntax in order to &lt;strong&gt;subscribe&lt;/strong&gt; &lt;strong&gt;delegate&lt;/strong&gt; into the &lt;strong&gt;IObservable &lt;/strong&gt;is &lt;/p&gt;  &lt;p&gt;available because &lt;strong&gt;IObservable&lt;/strong&gt; got the following extension options for its &lt;strong&gt;Subscribe&lt;/strong&gt; method&lt;/p&gt;  &lt;p&gt;(&lt;font color="#404040"&gt;under the hood we are speaking about extension methods&lt;/font&gt;).&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Action&amp;lt;TSource&amp;gt; &lt;strong&gt;onNext&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Action&amp;lt;TSource&amp;gt; &lt;strong&gt;onNext&lt;/strong&gt;, Action &lt;strong&gt;onCompleted&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Action&amp;lt;TSource&amp;gt; &lt;strong&gt;onNext&lt;/strong&gt;, Action&amp;lt;Exception&amp;gt; &lt;strong&gt;onError&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Action&amp;lt;TSource&amp;gt; &lt;strong&gt;onNext&lt;/strong&gt;, Action&amp;lt;Exception&amp;gt; &lt;strong&gt;onError&lt;/strong&gt;, Action &lt;strong&gt;onCompleted&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;so assuming we got &lt;strong&gt;IObservable&lt;/strong&gt; instance called foo, the following code is perfectly OK:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fc25d093-da1d-48d7-87ff-f041eeb04e2e" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#2b91af;"&gt;IDisposable&lt;/span&gt; unsubscribe = foo.Subscribe(value =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(value));&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;for simple &lt;strong&gt;subscription&lt;/strong&gt; only for the&lt;strong&gt; on next&lt;/strong&gt; callback.&lt;/p&gt;  &lt;p&gt;subscribing both for on next and on error will look as follow:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9e3cae1c-1e65-446e-a7da-dee960434d1b" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#2b91af;"&gt;IDisposable&lt;/span&gt; unsubscribe = foo.Subscribe(&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;value =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(value),&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;exc =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(exc));&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;what is actually happens is that under the hood the subscribe method creating&lt;/p&gt;  &lt;p&gt;instance of &lt;strong&gt;IObserver&lt;/strong&gt;, attaching the &lt;strong&gt;delegate&lt;/strong&gt;, and hand it to the &lt;strong&gt;IObservable&lt;/strong&gt; &lt;strong&gt;subscribe&lt;/strong&gt; method. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Code Sample&lt;/h5&gt;  &lt;p&gt;I took the previous post&amp;#39;s sample, which look as follow:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9b41c515-bd43-4869-a18b-8866da0dd319" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Program&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; obs = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Observer&lt;/span&gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; observable = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FakeObservableFeeder&lt;/span&gt;();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;IDisposable&lt;/span&gt; unsubscribe = observable.Subscribe(obs);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ReadKey();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;unsubscribe.Dispose();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Observer&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IObserver&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IObserver&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt;.OnCompleted()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Done&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IObserver&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt;.OnError(&lt;span style="color:#2b91af;"&gt;Exception&lt;/span&gt; exception)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Error: &amp;quot;&lt;/span&gt; + exception.Message);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IObserver&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt;.OnNext(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; value)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(value);&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;you can see at &lt;strong&gt;line 11&lt;/strong&gt;, that we &lt;strong&gt;implementing&lt;/strong&gt; &lt;strong&gt;IObserver&lt;/strong&gt; with code one line&lt;/p&gt;  &lt;p&gt;for each methods (&lt;font color="#404040"&gt;Console.WriteLine&lt;/font&gt; ).&lt;/p&gt;  &lt;p&gt;and at &lt;strong&gt;line 7&lt;/strong&gt;, we &lt;strong&gt;subscribing&lt;/strong&gt; this &lt;strong&gt;observer&lt;/strong&gt; into the &lt;strong&gt;IObservable&lt;/strong&gt; instance.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Code Sample using anonymous observer&lt;/h5&gt;  &lt;p&gt;this can be match simpler using &lt;strong&gt;anonymous observer&lt;/strong&gt;, as shown in the following snippet:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:57ec4320-7f9b-4c15-92af-1a95122787dd" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Program&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; observable = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FakeObservableFeeder&lt;/span&gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// subscribing handlers (Anonymous observer)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;IDisposable&lt;/span&gt; unsubscribe = observable.Subscribe(&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;value =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(value),&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;exc =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(exc),&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;() =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Done&amp;quot;&lt;/span&gt;));&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ReadKey();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;unsubscribe.Dispose();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;definitely less code was written.&lt;/p&gt;  &lt;p&gt;you can see the &lt;strong&gt;subscription&lt;/strong&gt; at &lt;strong&gt;line 7&lt;/strong&gt;.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;line 8&lt;/strong&gt;, is handling the &lt;strong&gt;on next&lt;/strong&gt; action. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;line 9&lt;/strong&gt;, is handling the&lt;strong&gt; on error&lt;/strong&gt; action. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;line 10&lt;/strong&gt;, is handling the &lt;strong&gt;on complete&lt;/strong&gt; action. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;what we have seen is that simple action can be &lt;strong&gt;subscribed&lt;/strong&gt; using &lt;strong&gt;anonymous observer&lt;/strong&gt; handlers.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:db94f3a7-88dd-48be-933d-6a3adaff6001" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/IObservable" rel="tag"&gt;IObservable&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IObserver" rel="tag"&gt;IObserver&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Rx" rel="tag"&gt;Rx&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f02%2f26%2frx-for-beginners-part-4-handlers.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f02%2f26%2frx-for-beginners-part-4-handlers.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=529188" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx">CLR 4</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx">Rx</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx">IObserver</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx">Reactive Extensions</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx">IObservable</category></item></channel></rss>