<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">[Export] Bnaya Eshet</title><subtitle type="html" /><id>http://blogs.microsoft.co.il/blogs/bnaya/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/" /><link rel="self" type="application/atom+xml" href="http://blogs.microsoft.co.il/blogs/bnaya/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2010-02-25T10:19:25Z</updated><entry><title>MEF for Beginner (Import from Xaml) - part 11</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/20/mef-for-beginner-import-from-xaml-part-11.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/20/mef-for-beginner-import-from-xaml-part-11.aspx</id><published>2010-03-20T15:28:23Z</published><updated>2010-03-20T15:28:23Z</updated><content type="html">&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;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="MEF" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx" /><category term="WPF" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx" /><category term="Extensibility" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Extensibility/default.aspx" /><category term="Beginner" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="extension" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/extension/default.aspx" /><category term=".net" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx" /><category term="Composition" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx" /><category term="ImportMany" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ImportMany/default.aspx" /><category term="Export" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Export/default.aspx" /><category term="Import" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Import/default.aspx" /></entry><entry><title>Recommendation</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/20/recommendation.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/20/recommendation.aspx</id><published>2010-03-20T09:25:41Z</published><updated>2010-03-20T09:25:41Z</updated><content type="html">&lt;h2&gt;Recommendation&lt;/h2&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;this is a &lt;a href="http://geekswithblogs.net/bdiaz/archive/2010/03/14/updated-the-whiteboard-demo.aspx" target="_blank"&gt;post&lt;/a&gt; recommendation about using &lt;strong&gt;Rx&lt;/strong&gt; framework with &lt;strong&gt;WPF events&lt;/strong&gt;,&lt;/p&gt;  &lt;p&gt;I&amp;#39;m recommending &lt;a href="http://geekswithblogs.net/bdiaz/archive/2010/03/14/updated-the-whiteboard-demo.aspx" target="_blank"&gt;this&lt;/a&gt; post from &lt;a href="http://geekswithblogs.net/bdiaz/Default.aspx"&gt;bobby&amp;#39;s blog&lt;/a&gt;, the post is demonstrating the&lt;/p&gt;  &lt;p&gt;use of creating &lt;strong&gt;observable&lt;/strong&gt; stream from &lt;strong&gt;WPF&lt;/strong&gt; event.&lt;/p&gt;  &lt;p&gt;it is a short post with nice little &lt;a href="http://www.bmdiaz.com/Files/Whiteboard.zip" target="_blank"&gt;code sample&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;bobby did a real good job by wrapping the &lt;strong&gt;observable&lt;/strong&gt; event (&lt;strong&gt;&lt;font color="#404040"&gt;Observable.FromEvent&lt;/font&gt;&lt;/strong&gt;) &lt;/p&gt;  &lt;p&gt;into more human readable format (using T4 template).&lt;/p&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=552386" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="WPF" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="CLR 4" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx" /><category term=".net" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx" /><category term="Rx" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx" /><category term="Reactive Extensions" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx" /></entry><entry><title>Rx - for beginners (part 10): Concat expression</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/16/rx-for-beginners-part-10-concat-expression.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/16/rx-for-beginners-part-10-concat-expression.aspx</id><published>2010-03-16T15:49:53Z</published><updated>2010-03-16T15:49:53Z</updated><content type="html">&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://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%207?uc=1&amp;amp;isFromRichUpload=1"&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;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="Beginner" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="CLR 4" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx" /><category term=".net" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx" /><category term="Rx" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx" /><category term="IObserver" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx" /><category term="Reactive Extensions" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="IObservable" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx" /></entry><entry><title>New release of Rx</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/16/new-release-of-rx.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/16/new-release-of-rx.aspx</id><published>2010-03-16T14:51:46Z</published><updated>2010-03-16T14:51:46Z</updated><content type="html">&lt;h5&gt;New release of &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx" target="_blank"&gt;Rx&lt;/a&gt; is available for download.&lt;/h5&gt;  &lt;p&gt;the Rx team has new release for .NET 3.5, .NET 4.0 RC, and Silverlight 3.&lt;/p&gt;  &lt;p&gt;you can download the library from &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the release includes some API changes,&lt;/p&gt;  &lt;p&gt;some APIs has moved into different assemblies,&lt;/p&gt;  &lt;p&gt;performance and bug fixes.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Highlights&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Moved &lt;strong&gt;IObservable &amp;amp; IObserver&lt;/strong&gt; to seperate assembly: &lt;strong&gt;System.Observable.dll&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Moved &lt;strong&gt;Schedulers&lt;/strong&gt; to &lt;strong&gt;System.CoreEx.dll&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Moved &lt;strong&gt;schedulers&lt;/strong&gt; to &lt;strong&gt;System.Concurrency&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Added &lt;strong&gt;schedulers&lt;/strong&gt; to &lt;strong&gt;subjects&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Removed &lt;strong&gt;deadlocks&lt;/strong&gt; throughout &lt;strong&gt;Rx&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Renamed Hide to &lt;strong&gt;AsObservable&lt;/strong&gt;, add &lt;strong&gt;AsObserver&lt;/strong&gt;, &lt;strong&gt;AsEnumerator&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Added &lt;strong&gt;ObserveOn&lt;/strong&gt;/&lt;strong&gt;SubscribeOn&lt;/strong&gt; on &lt;strong&gt;IScheduler&lt;/strong&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Release Notes&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;Build 1.0.2350.0 03/15/2010&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Added System.Observable to redist.txt. &lt;/li&gt;    &lt;li&gt;Changed Timeout to work on multiple notifications. &lt;/li&gt;    &lt;li&gt;Renamed HoldUntilChanged to DistinctUntilChanged. &lt;/li&gt;    &lt;li&gt;Made Semaphore for Silverlight internal. &lt;/li&gt;    &lt;li&gt;Adding Zip overload for IO&amp;lt;T&amp;gt; and IE&amp;lt;T&amp;gt; zipping. &lt;/li&gt;    &lt;li&gt;Changed last Throttle message to come out at Completion time and fix concurrency bug in Throttle. &lt;/li&gt;    &lt;li&gt;Changed OnErrorResumeNext to always complete. &lt;/li&gt;    &lt;li&gt;Changed Delay error semantics to be abort. &lt;/li&gt;    &lt;li&gt;Added ObserveOn/SubscribeOn on IScheduler. &lt;/li&gt;    &lt;li&gt;Fixed finally behavior. &lt;/li&gt;    &lt;li&gt;Minimized locks in subjects. &lt;/li&gt;    &lt;li&gt;Added MinBy, MaxBy operators as well as Min, Max with comparers. &lt;/li&gt;    &lt;li&gt;Added DistinctBy for Enumerable.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Build 1.0.2317.0 03/05/2010&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Moved to &lt;strong&gt;RC&lt;/strong&gt; for &lt;strong&gt;.NET 4&lt;/strong&gt; build. &lt;/li&gt;    &lt;li&gt;Moved &lt;strong&gt;IObservable &amp;amp; IObserver&lt;/strong&gt; to seperate assembly: &lt;strong&gt;System.Observable.dll&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Removed IsCritical and its usage on exceptions thrown inside Rx operators. &lt;/li&gt;    &lt;li&gt;Fixed bugs in Enumerable-&amp;gt;Observable conversions. &lt;/li&gt;    &lt;li&gt;Fixed threading bugs in EnumerableEx Merge and Amb operator. &lt;/li&gt;    &lt;li&gt;Changed signature of Buffer to expose an IList&amp;lt;T&amp;gt; as opposed to an IEnumerable&amp;lt;T&amp;gt;. &lt;/li&gt;    &lt;li&gt;Fixed Buffer behavior, with regards to flushing last frame and non-overlapping windows (count &amp;lt; skip). &lt;/li&gt;    &lt;li&gt;Renamed Buffer to BufferWithTime and BufferWithCount. &lt;/li&gt;    &lt;li&gt;Introduced BufferWithCount for IEnumerable. &lt;/li&gt;    &lt;li&gt;Renamed Hide to AsObservable, add AsObserver, AsEnumerator. &lt;/li&gt;    &lt;li&gt;Moved &lt;strong&gt;Schedulers&lt;/strong&gt; &amp;amp; &lt;strong&gt;Disposables&lt;/strong&gt; to &lt;strong&gt;System.CoreEx&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Added &lt;strong&gt;schedulers&lt;/strong&gt; to &lt;strong&gt;subjects&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Enforced abort semantics for all exceptions in Rx. &lt;/li&gt;    &lt;li&gt;Added OfType and Cast to Observable, plus additional Do methods + parity in EnumerableEx. &lt;/li&gt;    &lt;li&gt;Reworked &lt;strong&gt;GroupBy&lt;/strong&gt; to be lazy &amp;amp; performant. &lt;/li&gt;    &lt;li&gt;Removed &lt;strong&gt;deadlocks&lt;/strong&gt; throughout Rx. &lt;/li&gt;    &lt;li&gt;Fixed reentrancy bug in Scheduler. &lt;/li&gt;    &lt;li&gt;Added RefCountDisposable. &lt;/li&gt;    &lt;li&gt;Removed LockDisposable. &lt;/li&gt;    &lt;li&gt;Added AsyncLock. &lt;/li&gt;    &lt;li&gt;Changed TimeSpan.MaxValue to not be a sentinel value for Infinite. &lt;/li&gt;    &lt;li&gt;Changed IScheduler argument positioning to be last where possible. &lt;/li&gt;    &lt;li&gt;Moved &lt;strong&gt;schedulers&lt;/strong&gt; to &lt;strong&gt;System.Concurrency&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Renamed Scheduler.Now to Scheduler.&lt;strong&gt;CurrentThread&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Renamed Scheduler.Later to Scheduler.&lt;strong&gt;ThreadPool&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Removed Scheduler.Default. &lt;/li&gt;    &lt;li&gt;Added Scheduler.Immediate and ImmediateScheduler. &lt;/li&gt;    &lt;li&gt;Added Scheduler.&lt;strong&gt;TaskPool&lt;/strong&gt; and TaskPoolScheduler where Tasks are available. &lt;/li&gt;    &lt;li&gt;Added Scheduler.&lt;strong&gt;NewThread&lt;/strong&gt; and NewThreadScheduler. &lt;/li&gt;    &lt;li&gt;Added &lt;strong&gt;SynchronizationContextScheduler&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Added IConnectableObservable. &lt;/li&gt;    &lt;li&gt;Added ConnectableObservable. &lt;/li&gt;    &lt;li&gt;Removed EventSubject. &lt;/li&gt;    &lt;li&gt;Changed Publish/Replay/Prune to return IConnectableObservables. &lt;/li&gt;    &lt;li&gt;Added RefCount operator. &lt;/li&gt;    &lt;li&gt;Made all subjects not disposable. &lt;/li&gt;    &lt;li&gt;Added schedulers to asynchronous operations. &lt;/li&gt;    &lt;li&gt;Made Rx assemblies CLSCompliant. &lt;/li&gt;    &lt;li&gt;Added aggregate operators. &lt;/li&gt;    &lt;li&gt;Removed properties from Rx. &lt;/li&gt;    &lt;li&gt;Removed timedrift from time based operators. &lt;/li&gt;    &lt;li&gt;Changed default schedulers for operators. &lt;/li&gt;    &lt;li&gt;Cleaned up Generate and GenerateWithTime overloads. &lt;/li&gt;    &lt;li&gt;Renamed GroupDisposable to CompositeDisposable. &lt;/li&gt;    &lt;li&gt;Moved reference required overloads of extension methods to defining namespace. &lt;/li&gt;    &lt;li&gt;Many other small bug fixes. &lt;/li&gt;    &lt;li&gt;Removed BooleanSignal. &lt;/li&gt;    &lt;li&gt;Fixed timing bug in ControlScheduler.&lt;/li&gt; &lt;/ul&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:8d371cef-cd11-4bf8-8d5f-e458d709427d" 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;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=548211" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="CLR 4" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx" /><category term=".net" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx" /><category term="Rx" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx" /><category term="IObserver" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx" /><category term="Reactive Extensions" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx" /><category term="IObservable" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx" /></entry><entry><title>Rx - for beginners (part 9): Hot Vs. Cold observable</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/13/rx-for-beginners-part-9-hot-vs-cold-observable.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/13/rx-for-beginners-part-9-hot-vs-cold-observable.aspx</id><published>2010-03-13T11:41:40Z</published><updated>2010-03-13T11:41:40Z</updated><content type="html">&lt;h2&gt;Rx - for beginners (part 9): Hot Vs. Cold observable&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1266073365_kghostviewHotCold_439ECF0F.jpg"&gt;&lt;img style="border-right-width:0px;margin:0px 10px 0px 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" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/1266073365_kghostviewHotCold_thumb_6D522435.jpg" width="88" height="88" /&gt;&lt;/a&gt; this post is the 9th 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://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%207?uc=1&amp;amp;isFromRichUpload=1"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;in this post we will focus on the &lt;strong&gt;Hot Vs. Cold observable&lt;/strong&gt; stream.&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%209?uc=1&amp;amp;isFromRichUpload=1"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;&lt;font color="#404040"&gt;If a tree falls in a forest and no one is around to hear it,&lt;/font&gt;&lt;/h5&gt;  &lt;h5&gt;&lt;font color="#404040"&gt;does it make a sound?&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;&lt;font color="#404040"&gt;if it do make a sound when nobody observed it, we should mark it as &lt;strong&gt;hot&lt;/strong&gt;,&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#404040"&gt;otherwise it should be marked as &lt;strong&gt;cold&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1266073365_kghostviewHotCold1_2EF3484C.jpg"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;What is &lt;strong&gt;Hot&lt;/strong&gt; &lt;strong&gt;observable&lt;/strong&gt;?&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;hot observable&lt;/strong&gt; streams are streams that is active regardless whether or not &lt;/p&gt;  &lt;p&gt;they are being observed.&lt;/p&gt;  &lt;p&gt;such stream are the &lt;strong&gt;mouse move&lt;/strong&gt; event or &lt;strong&gt;timer&lt;/strong&gt; event.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;What is &lt;strong&gt;Cold&lt;/strong&gt; &lt;strong&gt;observable&lt;/strong&gt;?&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;cold observable&lt;/strong&gt; streams are streams that is activated upon subscription&lt;/p&gt;  &lt;p&gt;(in most case new stream will be activate for each subscription).&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;Observable.Interval&lt;/strong&gt; is a sample for cold observable stream.&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%209?uc=1&amp;amp;isFromRichUpload=1"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the following sample demonstrate the difference between &lt;strong&gt;hot&lt;/strong&gt; and &lt;strong&gt;cold&lt;/strong&gt; &lt;strong&gt;observable&lt;/strong&gt; streams:&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:e5b70755-cd70-486b-b212-bd90f2784b31" 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;var&lt;/span&gt; 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;&lt;span style="color:#008000;"&gt;// create Cold observable stream (this stream will not project values&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;//&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;until the subscription, and will project new stream for each subscription)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; coldStream = &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;// create Hot observable stream out of .NET event&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; hotStream = &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;(timer,&lt;span style="color:#a31515;"&gt;&amp;quot;Elapsed&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt; startTime = &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now;&lt;/li&gt; &lt;li&gt;timer.Start(); &lt;span style="color:#008000;"&gt;// start the timer (the timer will start producing values &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;&lt;span style="color:#008000;"&gt;// regardless of the subscription)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;// convert the hot stream to stream that project the amount of seconds from the timer start&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; hotStreamInterval = hotStream.Select ( value =&amp;gt; (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&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#2b91af;"&gt;Thread&lt;/span&gt;.Sleep(&lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(3)); &lt;span style="color:#008000;"&gt;// sleep for 3 seconds befor the subscription&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (hotStreamInterval.Subscribe (value =&amp;gt; Write(&lt;span style="color:#a31515;"&gt;&amp;quot;Hot: &amp;quot;&lt;/span&gt; + value, &lt;span style="color:#2b91af;"&gt;ConsoleColor&lt;/span&gt;.Green)))&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;(coldStream.Subscribe(value =&amp;gt; Write(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#92;t&amp;#92;tCold 1: &amp;quot;&lt;/span&gt; + value,&lt;span style="color:#2b91af;"&gt;ConsoleColor&lt;/span&gt;.Yellow)))&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:#2b91af;"&gt;Thread&lt;/span&gt;.Sleep(&lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(2)); &lt;span style="color:#008000;"&gt;// sleep for 2 seconds befor the second subscription&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// second subscription &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;using&lt;/span&gt;(coldStream.Subscribe(value =&amp;gt; Write(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#92;t&amp;#92;t&amp;#92;t&amp;#92;tCold 2: &amp;quot;&lt;/span&gt; + value,&lt;span style="color:#2b91af;"&gt;ConsoleColor&lt;/span&gt;.DarkYellow)))&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:#2b91af;"&gt;Thread&lt;/span&gt;.Sleep(&lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(4)); &lt;span style="color:#008000;"&gt;// wait 4 second before disposal &lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} &lt;span style="color:#008000;"&gt;// dispose hotStreamInterval and coldStream 2&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;} &lt;span style="color:#008000;"&gt;// dispose hotStreamInterval and coldStream 1&lt;/span&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 system &lt;strong&gt;timer&lt;/strong&gt; with 1 second interval.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 4&lt;/strong&gt;, define &lt;strong&gt;cold observable stream&lt;/strong&gt; with interval of 1 second.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 7&lt;/strong&gt;, creating &lt;strong&gt;hot observable&lt;/strong&gt; stream out of the &lt;strong&gt;timer elapsed&lt;/strong&gt; event (&lt;font color="#404040"&gt;we can use this technique on any .NET event&lt;/font&gt;).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 9&lt;/strong&gt;, start the timer (because this is &lt;strong&gt;hot&lt;/strong&gt; stream the timer will not wait for the subscription).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 12&lt;/strong&gt;, format the timer stream into more friendly observable stream that will project the &lt;strong&gt;timer duration&lt;/strong&gt; in seconds.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 14&lt;/strong&gt;, sleeping 3 second &lt;strong&gt;before&lt;/strong&gt; the &lt;strong&gt;subscription&lt;/strong&gt; (this will make the difference between the&lt;strong&gt; hot streams&lt;/strong&gt; that will&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; increase the value even though no body is listening and the&lt;strong&gt; cold stream&lt;/strong&gt; that doesn&amp;#39;t construct until the subscription).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 15&lt;/strong&gt;, &lt;strong&gt;subscribing&lt;/strong&gt; to the &lt;strong&gt;hot observable&lt;/strong&gt; stream (&lt;font color="#404040"&gt;the using statement is the subscription scope&lt;/font&gt;).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 16&lt;/strong&gt;, first &lt;strong&gt;subscription&lt;/strong&gt; to the &lt;strong&gt;cold observable&lt;/strong&gt; stream.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 18&lt;/strong&gt;, sleeping &lt;strong&gt;before&lt;/strong&gt; the &lt;strong&gt;second subscription&lt;/strong&gt; to the cold stream.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 20&lt;/strong&gt;, second &lt;strong&gt;subscription&lt;/strong&gt; to the &lt;strong&gt;cold observable&lt;/strong&gt; stream (&lt;font color="#404040"&gt;the second subscription will construct new observable stream&lt;/font&gt;).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 22&lt;/strong&gt;, waiting 4 second before leaving the subscription scope.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;output&lt;/strong&gt; will look as follow:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_5B45E0A8.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="IObservable, Rx, IObserver" border="0" alt="IObservable, Rx, IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_2D0BE4EE.png" width="380" height="254" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;the &lt;strong&gt;hot timer observable&lt;/strong&gt; stream (green) is starting with value = 3 because it is&amp;#160; hot stream       &lt;br /&gt;which was producing value during the 3 second sleeping period &lt;/li&gt;    &lt;li&gt;the &lt;strong&gt;first cold observable&lt;/strong&gt; stream (yellow) is starting with value = 0 because the stream were constructed after       &lt;br /&gt;the sleep period. &lt;/li&gt;    &lt;li&gt;the &lt;strong&gt;second cold observable&lt;/strong&gt; stream (dark yellow) is starting with value = 0 because each subscription       &lt;br /&gt;is constructing new stream. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1266073365_kghostviewHotCold1_628B8EDD.jpg"&gt;&lt;img style="border-right-width:0px;margin: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" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/1266073365_kghostviewHotCold1_thumb_78C795DA.jpg" width="128" height="128" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;subscribing to &lt;strong&gt;hot observable&lt;/strong&gt; stream will produce different result &lt;/p&gt;  &lt;p&gt;from &lt;strong&gt;cold observable&lt;/strong&gt; stream subscription, and it is important to&lt;/p&gt;  &lt;p&gt;be aware for the nature of the stream you subscribing to.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&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:d8781235-d650-4509-b4dd-267d1e304994" 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%2f13%2frx-for-beginners-part-9-hot-vs-cold-observable.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%2f13%2frx-for-beginners-part-9-hot-vs-cold-observable.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=544302" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="Beginner" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term=".net" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx" /><category term="Rx" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx" /><category term="IObserver" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx" /><category term="Reactive Extensions" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="IObservable" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx" /></entry><entry><title>Rx - for beginners (part 8): Combine Latest expression</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/10/rx-for-beginners-part-8-combine-latest-expression.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/10/rx-for-beginners-part-8-combine-latest-expression.aspx</id><published>2010-03-10T16:32:27Z</published><updated>2010-03-10T16:32:27Z</updated><content type="html">&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://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%207?uc=1&amp;amp;isFromRichUpload=1"&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;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="Silverlight" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Silverlight/default.aspx" /><category term="Beginner" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx" /><category term="CLR 4" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx" /><category term=".net" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx" /><category term="Rx" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx" /><category term="IObserver" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx" /><category term="Reactive Extensions" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="IObservable" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx" /></entry><entry><title>Calling WCF secured service from Java</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/09/calling-wcf-secured-service-from-java.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/09/calling-wcf-secured-service-from-java.aspx</id><published>2010-03-09T20:40:00Z</published><updated>2010-03-09T20:40:00Z</updated><content type="html">&lt;h2&gt;Calling &lt;strong&gt;WCF&lt;/strong&gt; secured service from &lt;strong&gt;Java&lt;/strong&gt;&lt;/h2&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1267819196_competitors_711A4350.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;margin-left:0px;border-left-width:0px;margin-right:0px;" title="1267819196_competitors" border="0" alt="1267819196_competitors" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/1267819196_competitors_thumb_6554D651.jpg" width="86" height="86" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;recently I was working on exposing &lt;strong&gt;secured&lt;/strong&gt; &lt;strong&gt;WCF&lt;/strong&gt; service &lt;/p&gt;  &lt;p&gt;to &lt;strong&gt;Java&lt;/strong&gt; consumers.&lt;/p&gt;  &lt;p&gt;I was responsible for the &lt;strong&gt;.NET&lt;/strong&gt; side and a java expert named &lt;strong&gt;Tsvika&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;responsible for the &lt;strong&gt;Java&lt;/strong&gt; side.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;enabling &lt;strong&gt;secured conversation&lt;/strong&gt; between &lt;strong&gt;Java&lt;/strong&gt; and&lt;strong&gt; .NET&lt;/strong&gt; using &lt;strong&gt;WCF&lt;/strong&gt; is not a trivial task,&lt;/p&gt;  &lt;p&gt;and it does needed some additional steps.&lt;/p&gt;  &lt;p&gt;you should have &lt;strong&gt;certificate&lt;/strong&gt; install, and having the &lt;strong&gt;binding&lt;/strong&gt; and &lt;strong&gt;behaviors&lt;/strong&gt; configured &lt;/p&gt;  &lt;p&gt;in a way that the&lt;strong&gt; Java proxy&lt;/strong&gt; can manage.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Certificates&lt;/h5&gt;  &lt;p&gt;the first step needed is having a valid &lt;strong&gt;certificate&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;certificate&lt;/strong&gt; should be installed into the &lt;strong&gt;service&amp;#39;s hosting machine&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;you can learn more on how to handle the &lt;strong&gt;certificates&lt;/strong&gt; in &lt;a href="http://www.thatindigogirl.com/CategoryView,category,Code.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Service configuration&lt;/h5&gt;  &lt;h6&gt;Binding&lt;/h6&gt;  &lt;p&gt;the secure &lt;strong&gt;binding&lt;/strong&gt; should 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:9a9dc47d-551b-4abe-ad48-5ee6839fd82b" 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;wsHttpBinding&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;UsernameAndPassword&lt;/span&gt;&amp;quot;&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;security&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;mode&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Message&lt;/span&gt;&amp;quot;&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;clientCredentialType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;UserName&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&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;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;negotiateServiceCredential&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;&amp;quot;&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;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;establishSecurityContext&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;&amp;quot;&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;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;algorithmSuite&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Basic128&lt;/span&gt;&amp;quot;&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;security&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;wsHttpBinding&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;strong&gt;line 3&lt;/strong&gt;, the &lt;strong&gt;binding mode&lt;/strong&gt; should be &lt;strong&gt;Message&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 4&lt;/strong&gt;, the &lt;strong&gt;client certificate type&lt;/strong&gt; should be &lt;strong&gt;UserName&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 5&lt;/strong&gt;, the&lt;strong&gt; negotiation service credentials&lt;/strong&gt; must switch &lt;strong&gt;off&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 6&lt;/strong&gt;, the &lt;strong&gt;establish security context&lt;/strong&gt; should also turn &lt;strong&gt;off&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;Behaviors&lt;/h6&gt;  &lt;p&gt;use the following &lt;strong&gt;behaviors&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:9a73bacb-cb36-45f6-8267-468094d44ae4" 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;serviceBehaviors&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behavior&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Bnaya.Samples.UsernameAndPassword&lt;/span&gt;&amp;quot;&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;serviceMetadata&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;httpGetEnabled&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;policyVersion&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Default&lt;/span&gt;&amp;quot;&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;serviceCredentials&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;serviceCertificate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;findValue&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;RPKey&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;storeLocation&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;LocalMachine&lt;/span&gt;&amp;quot;&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;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;storeName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;TrustedPeople&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;x509FindType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;FindBySubjectName&lt;/span&gt;&amp;quot;&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;userNameAuthentication&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;userNamePasswordValidationMode&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Custom&lt;/span&gt;&amp;quot;&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;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;customUserNamePasswordValidatorType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Bnaya.Samples.MyUserNameValidator, WcfSecureed&lt;/span&gt;&amp;quot;&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;serviceCredentials&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behavior&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;serviceBehaviors&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;strong&gt;lines 5-6&lt;/strong&gt;, define which &lt;strong&gt;certificate&lt;/strong&gt; should use for the service (RPKey is the name of the certificate).&lt;/p&gt;  &lt;p&gt;in case of &lt;strong&gt;service hosting&lt;/strong&gt; it is more reasonable to install the &lt;strong&gt;certificate&lt;/strong&gt; on the &lt;strong&gt;machine&lt;/strong&gt; level (instead of the user level) .&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 7-8&lt;/strong&gt;, define the &lt;strong&gt;authentication handler &lt;/strong&gt;(as you can see 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:4dd62133-2602-419d-906c-737c54e6d133" 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;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;sealed&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyUserNameValidator&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;UserNamePasswordValidator&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; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Validate(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; userName, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; password)&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;if&lt;/span&gt; (userName != &lt;span style="color:#a31515;"&gt;&amp;quot;admin&amp;quot;&lt;/span&gt; || password !=&lt;span style="color:#a31515;"&gt;&amp;quot;admin&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;&lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SecurityException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Access denied.&amp;quot;&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;}&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; the &lt;strong&gt;validate&lt;/strong&gt; method is where your authentication code goes.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;End point&lt;/h6&gt;  &lt;p&gt;nothing is special about the definition of the service section&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:6b39083f-b39a-44f4-997e-c74c05a1d857" 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;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;service&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Bnaya.Samples.Service1&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Bnaya.Samples.UsernameAndPassword&lt;/span&gt;&amp;quot;&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;host&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;baseAddresses&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&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;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;baseAddress&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;http://localhost:8731/Service1/&lt;/span&gt;&amp;quot;&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;baseAddresses&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;host&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;endpoint&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;wsHttpBinding&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;contract&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Bnaya.Samples.IService1&lt;/span&gt;&amp;quot;&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;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;bindingConfiguration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;UsernameAndPassword&lt;/span&gt;&amp;quot;&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;identity&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;localhost&lt;/span&gt;&amp;quot;&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;identity&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;endpoint&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;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;service&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;strong&gt;small tip&lt;/strong&gt;: replace the &lt;strong&gt;localhost&lt;/strong&gt; with the correct &lt;strong&gt;IP&lt;/strong&gt; so when the &lt;strong&gt;Java&lt;/strong&gt; proxy is generated, &lt;/p&gt;  &lt;p&gt;the endpoint will be correct.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Java&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;java&lt;/strong&gt; has several libraries that can invoke &lt;strong&gt;WCF&lt;/strong&gt;, unfortunately not all of them&lt;/p&gt;  &lt;p&gt;has good implementation for the &lt;strong&gt;WCF secured conversation&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;the library that do working fine with secured conversation is &lt;em&gt;&lt;a href="http://java.sun.com/webservices/" target="_blank"&gt;&lt;strong&gt;Sun: Metro Web Services&lt;/strong&gt;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;and more precisely you should use &lt;a href="http://java.sun.com/webservices/reference/tutorials/wsit/doc/" target="_blank"&gt;&lt;strong&gt;WSIT&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;do not waste your time&lt;/strong&gt; on &lt;a href="http://ws.apache.org/axis2/modules/rampart/1_0/security-module.html"&gt;&lt;strong&gt;Axis2&lt;/strong&gt;&lt;/a&gt; /&lt;strong&gt; &lt;/strong&gt;&lt;a href="http://ws.apache.org/axis2/modules/rampart/1_0/security-module.html" target="_blank"&gt;&lt;strong&gt;Rampart&lt;/strong&gt;&lt;/a&gt; it is only half backed in compare to the Sun library.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;this task is not travel, but with the right library and java expert like Yaakov, &lt;/p&gt;  &lt;p&gt;it is certainly feasible. &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:b7a92650-3c74-4888-92bd-86db5cd3694a" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/WCF" rel="tag"&gt;WCF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Java" rel="tag"&gt;Java&lt;/a&gt;&lt;/div&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=534938" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="WCF" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WCF/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="expert" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/expert/default.aspx" /><category term=".net" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx" /></entry><entry><title>Rx - for beginners (part 7): Zip expression</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/05/rx-for-beginners-part-7-zip-expression.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/05/rx-for-beginners-part-7-zip-expression.aspx</id><published>2010-03-04T23:43:23Z</published><updated>2010-03-04T23:43:23Z</updated><content type="html">&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://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%207?uc=1&amp;amp;isFromRichUpload=1"&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;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="Beginner" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="CLR 4" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx" /><category term=".net" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx" /><category term="Rx" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx" /><category term="IObserver" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx" /><category term="Reactive Extensions" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="IObservable" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx" /></entry><entry><title>Recommending on a blogger</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/04/recommending-on-a-blogger.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/04/recommending-on-a-blogger.aspx</id><published>2010-03-04T18:38:02Z</published><updated>2010-03-04T18:38:02Z</updated><content type="html">&lt;h2&gt;Recommending on a blogger &lt;/h2&gt;  &lt;p&gt;I just discover a blogger that you may want to pay attention to:&lt;/p&gt;  &lt;p&gt;his blog has some short tips on new little features that were added to &lt;strong&gt;VS 2010&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;among his tips are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blogs.msdn.com/wriju/archive/2010/03/04/net-framework-4-0-newbie-string-isnullorwhitespace.aspx"&gt;String.IsNullOrWhiteSpace&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/wriju/archive/2010/03/02/net-framework-4-0-newbie-sortedset-t.aspx" target="_blank"&gt;SortedSet&amp;lt;T&amp;gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/wriju/archive/2010/03/04/net-framework-4-0-newbie-addition-to-environment-specialfolder-enum.aspx"&gt;Addition to Environment.SpecialFolder enum&lt;/a&gt;      &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;want to read more?&lt;/p&gt;  &lt;p&gt;register to his blog at &lt;a title="http://blogs.msdn.com/wriju/default.aspx" href="http://blogs.msdn.com/wriju/default.aspx"&gt;http://blogs.msdn.com/wriju/default.aspx&lt;/a&gt;&lt;/p&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=534462" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="VS2010" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/VS2010/default.aspx" /></entry><entry><title>Rx - for beginners (part 6): Merge expression</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/02/rx-for-beginners-part-6-merge-expression.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/02/rx-for-beginners-part-6-merge-expression.aspx</id><published>2010-03-02T19:46:41Z</published><updated>2010-03-02T19:46:41Z</updated><content type="html">&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;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="Beginner" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term=".net" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx" /><category term="Rx" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx" /><category term="IObserver" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx" /><category term="Reactive Extensions" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="IObservable" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx" /></entry><entry><title>Rx - for beginners (part 5): marble diagrams, select and where</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/28/rx-for-beginners-part-5-marble-diagrams-select-and-where.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/28/rx-for-beginners-part-5-marble-diagrams-select-and-where.aspx</id><published>2010-02-28T19:24:40Z</published><updated>2010-02-28T19:24:40Z</updated><content type="html">&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;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="Beginner" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="CLR 4" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx" /><category term=".net" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx" /><category term="Rx" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx" /><category term="IObserver" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx" /><category term="Reactive Extensions" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="IObservable" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx" /></entry><entry><title>Rx - for beginners (part 4): anonymous observer handler</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/26/rx-for-beginners-part-4-anonymous-observer-handler.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/26/rx-for-beginners-part-4-anonymous-observer-handler.aspx</id><published>2010-02-26T14:04:12Z</published><updated>2010-02-26T14:04:12Z</updated><content type="html">&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;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="Beginner" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="CLR 4" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx" /><category term=".net" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx" /><category term="Rx" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx" /><category term="IObserver" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx" /><category term="Reactive Extensions" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx" /><category term="IObservable" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx" /></entry><entry><title>MEF Preview 9 released</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/26/mef-preview-9-released.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/26/mef-preview-9-released.aspx</id><published>2010-02-26T07:51:14Z</published><updated>2010-02-26T07:51:14Z</updated><content type="html">&lt;h2&gt;MEF Preview 9 was released&lt;/h2&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mef.codeplex.com/" target="_blank"&gt;&lt;strong&gt;MEF&lt;/strong&gt;&lt;/a&gt;&amp;#160;&lt;strong&gt;preview 9 &lt;/strong&gt;changes will be reflected the in the release of&lt;strong&gt; .NET 4.0&lt;/strong&gt; and &lt;strong&gt;Silverlight 4.0&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;except from bug fixing, there was some changes to the &lt;strong&gt;API&lt;/strong&gt;,&lt;/p&gt;  &lt;p&gt;most of the changes is related to&amp;#160; &lt;strong&gt;System.ComponentModel.Composition.Initilization.dll&lt;/strong&gt;, &lt;/p&gt;  &lt;p&gt;which is not yet available only for none Silverlight application :-(&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;here is a short list of API changes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p&gt;&lt;strong&gt;PackageCatalog&lt;/strong&gt; were brought back, and changed it name to &lt;strong&gt;DeploymentCatalog&lt;/strong&gt;. &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;PartCreator&lt;/strong&gt; was renamed to &lt;strong&gt;ExportFactory&lt;/strong&gt;.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;PartInitializer&lt;/strong&gt; was renamed to &lt;strong&gt;CompositionInitializer&lt;/strong&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;CompositionHost.InitializeContainer&lt;/strong&gt; was renamed to &lt;strong&gt;CompositionHost.Initialize&lt;/strong&gt;&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;i do hope that the &lt;strong&gt;System.ComponentModel.Composition.Initilization.dll&lt;/strong&gt; will finally find it place &lt;/p&gt;  &lt;p&gt;into the CLR 4.0 release.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;you can &lt;a href="http://mef.codeplex.com/" target="_blank"&gt;download&lt;/a&gt; it from the &lt;a href="http://mef.codeplex.com/" target="_blank"&gt;MEF codeplex&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the information was taken from &lt;a href="http://weblogs.asp.net/whaggard/default.aspx"&gt;Wes&amp;#39; Puzzling Blog&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;UPDATES:&lt;/h5&gt;  &lt;p&gt;From: &lt;a href="http://www.codeplex.com/site/users/view/gblock" target="_blank"&gt;Glenn block&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Unfortunately we will not be shipping CompositionInitializer / Host as part of .NET 4.0. .NET 4.0 and SL are on different ship cycles and the desktop locked long before we had the functionality in SL. We will do an OOB release on codeplex for desktop. I currently have an early version on my &lt;a href="http://cid-f8b2fd72406fb218.skydrive.live.com/self.aspx/blog/Composition.Initialization.Desktop.zip" target="_blank"&gt;SkyDrive&lt;/a&gt;, but we will get bits updated for codeplex. The plan is to role CI into the desktop in the future.&lt;/p&gt;  &lt;p&gt;&amp;#160;&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:0767317B-992E-4b12-91E0-4F059A8CECA8:7f2eeeff-b7d8-4c2a-91cc-c0522077bd47" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &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/Import" rel="tag"&gt;Import&lt;/a&gt;,&lt;a href="http://technorati.com/tags/InportMany" rel="tag"&gt;InportMany&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Export" rel="tag"&gt;Export&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Extension" rel="tag"&gt;Extension&lt;/a&gt;&lt;/div&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=528987" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="MEF" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx" /><category term="Silverlight" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Silverlight/default.aspx" /><category term="Extensibility" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Extensibility/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="CLR 4" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx" /><category term="extension" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/extension/default.aspx" /><category term=".net" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx" /><category term="IoC" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IoC/default.aspx" /><category term="Composition" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx" /><category term="ImportMany" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ImportMany/default.aspx" /><category term="Import" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Import/default.aspx" /></entry><entry><title>Rx - for beginners (part 3): IObservable Vs. IEnumerable</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-part-3-iobservable-vs-ienumerable.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-part-3-iobservable-vs-ienumerable.aspx</id><published>2010-02-25T08:23:42Z</published><updated>2010-02-25T08:23:42Z</updated><content type="html">&lt;h2&gt;&lt;strong&gt;Rx&lt;/strong&gt; - for beginners (part 3): IObservable Vs. IEnumerable&lt;/h2&gt;  &lt;p&gt;this post is the 3rd 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;this post will focus on how exactly the &lt;strong&gt;IObservable&lt;/strong&gt;/&lt;strong&gt;IObserver&lt;/strong&gt; mirror &lt;strong&gt;IEnumerable&lt;/strong&gt;/&lt;strong&gt;IEnumerator&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1266073365_kghostview_6B15105E.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="1266073365_kghostview" border="0" alt="1266073365_kghostview" src="http://blogs.microsoft.co.il/blogs/bnaya/1266073365_kghostview_thumb_400CFC8C.jpg" width="128" height="128" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;h5&gt;&lt;strong&gt;IEnumerator&lt;/strong&gt; operations&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;IEnumerable&lt;/strong&gt; expose the following operations:&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:48605abb-fcc4-4e29-ba6c-a0a31a421198" 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;interface&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerator&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color:#2b91af;"&gt;IDisposable&lt;/span&gt;, IEnumerator&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;T Current { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&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;interface&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;object&lt;/span&gt; Current { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; MoveNext();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Reset();&lt;/li&gt; &lt;li&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;Move next&lt;/strong&gt;: indicate whether the operation &lt;strong&gt;completed&lt;/strong&gt;       &lt;br /&gt;(&lt;font color="#404040"&gt;no more item available on the item source&lt;/font&gt;).       &lt;br /&gt;and it may also throw &lt;strong&gt;Exception&lt;/strong&gt; if something have got wrong. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Current&lt;/strong&gt;: is handing the current item. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Reset&lt;/strong&gt;: is restarting the iteration. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;&lt;strong&gt;IObserver&lt;/strong&gt; mirrored operations&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;IObserver&lt;/strong&gt; is mirroring &lt;strong&gt;IEnumerator,&lt;/strong&gt; instead of asking the &lt;strong&gt;IEnumerator,&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;IObserver&lt;/strong&gt; will tell you what&amp;#39;s is happening.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;this is known as &amp;quot;don&amp;#39;t call us we will call you&amp;quot; :-)&lt;/em&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:b7529248-0faf-4152-a798-1114e0ea823d" 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;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IObserver&lt;/span&gt;&amp;lt;T&amp;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;void&lt;/span&gt; OnCompleted();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnError(&lt;span style="color:#2b91af;"&gt;Exception&lt;/span&gt; exception);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnNext(T value);&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 &lt;strong&gt;IObserver&lt;/strong&gt; is actually a &lt;strong&gt;callback&lt;/strong&gt; interface which will be&lt;strong&gt; called by&lt;/strong&gt; the items &lt;strong&gt;feeder&lt;/strong&gt;,&lt;/p&gt;  &lt;p&gt;whenever something occurs.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;On complete&lt;/strong&gt;: is mirroring &lt;strong&gt;move next&lt;/strong&gt;, by notifying that the feeding source       &lt;br /&gt;has no more items. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;On error&lt;/strong&gt;: is also mirroring &lt;strong&gt;move next&lt;/strong&gt;, but this time it mirror the move next &lt;strong&gt;throw&lt;/strong&gt; exception behavior. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;On next&lt;/strong&gt;: is mirroring the &lt;strong&gt;current&lt;/strong&gt; property, by &lt;strong&gt;pushing new value&lt;/strong&gt; into       &lt;br /&gt;the the observer OnNext implementation. &lt;/li&gt;    &lt;li&gt;because of the &lt;strong&gt;push&lt;/strong&gt; nature of the &lt;strong&gt;IObserver&lt;/strong&gt; the &lt;strong&gt;reset&lt;/strong&gt; does not mirrored. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;&lt;strong&gt;IEnumerable&lt;/strong&gt; Operations&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:1db90dfb-3bef-4987-a460-7cebf7fafeb6" 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;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; : IEnumerable&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;IEnumerator&lt;/span&gt;&amp;lt;T&amp;gt; GetEnumerator();&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;IEnumerable&lt;/strong&gt; has one method that return &lt;strong&gt;IEnumerator&lt;/strong&gt; with can be use &lt;/p&gt;  &lt;p&gt;to iterate through the items by &lt;strong&gt;pulling&lt;/strong&gt; the items sequentially.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;&lt;strong&gt;IObservable&lt;/strong&gt; mirrored operations&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:792b2655-145f-47eb-99c2-6f878ca98640" 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;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IObservable&lt;/span&gt;&amp;lt;T&amp;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;IDisposable&lt;/span&gt; Subscribe(&lt;span style="color:#2b91af;"&gt;IObserver&lt;/span&gt;&amp;lt;T&amp;gt; observer);&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;ul&gt;   &lt;li&gt;through &lt;strong&gt;IObservable&lt;/strong&gt; we can subscribe to content feeders by handing       &lt;br /&gt;implementation &lt;strong&gt;IObserver&lt;/strong&gt;, then the feeder can use the &lt;strong&gt;IObserver&lt;/strong&gt; interface       &lt;br /&gt;for each of the operation we discussed earlier. &lt;/li&gt;    &lt;li&gt;the subscribe operation return &lt;strong&gt;IDisposable&lt;/strong&gt;&amp;#160; instance that is used       &lt;br /&gt;for &lt;strong&gt;unsubscribe&lt;/strong&gt; the &lt;strong&gt;observer&lt;/strong&gt; from the feeder.       &lt;br /&gt;&lt;font color="#404040"&gt;this is match safer then using unsubscribe method because it doesn&amp;#39;t has side effects,&amp;#160; &lt;br /&gt;just think of what&amp;#39;s happens when you subscribe anonymous delegate&lt;/font&gt;.&amp;#160; &lt;br /&gt;in fact the disposable instance is mirroring &lt;strong&gt;IEnumerator&amp;lt;T&amp;gt;&lt;/strong&gt; which is inheriting from &lt;strong&gt;IDisposable&lt;/strong&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;by mirroring &lt;strong&gt;IEnumerable&lt;/strong&gt;/&lt;strong&gt;IEnumerator, IObservable/IObserver&lt;/strong&gt; can change the data&lt;/p&gt;  &lt;p&gt;flow direction from &lt;strong&gt;pull&lt;/strong&gt; to &lt;strong&gt;push&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Code Sample&lt;/h5&gt;  &lt;p&gt;you can find &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%203" target="_blank"&gt;code sample&lt;/a&gt; that implement simple scenario of feeder&lt;/p&gt;  &lt;p&gt;that feed increasing integer sequence as long as the integer value is below 100.&lt;/p&gt;  &lt;p&gt;the solution contain 2 projects, one implement the scenario using enumerable and the&lt;/p&gt;  &lt;p&gt;other is using observable.&lt;/p&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%203" 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:c9ae89aa-cfb9-4bc6-89c4-8239640bfd99" 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%2f25%2frx-for-beginners-part-3-iobservable-vs-ienumerable.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%2f25%2frx-for-beginners-part-3-iobservable-vs-ienumerable.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=528069" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="Beginner" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="Rx" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx" /><category term="IObserver" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="IObservable" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx" /></entry><entry><title>Rx - for beginners TOC</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-toc.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-toc.aspx</id><published>2010-02-25T08:19:25Z</published><updated>2010-02-25T08:19:25Z</updated><content type="html">&lt;h2&gt;Rx - for beginners TOC&lt;/h2&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;&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;) for beginners:&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/19/rx-reactive-extension-for-beginner-part-1.aspx" target="_blank"&gt;What is Rx (Interactive Vs. Reactive, pull Vs. Push)?&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/22/rx-reactive-extension-for-beginners-part-2.aspx" target="_blank"&gt;The Rx concept&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-part-3-iobservable-vs-ienumerable.aspx" target="_blank"&gt;IObservable Vs. IEnumerable&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/26/rx-for-beginners-part-4-handlers.aspx" target="_blank"&gt;anonymous observer handler&lt;/a&gt;&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/28/rx-for-beginners-part-5-marble-diagrams-select-and-where.aspx" target="_blank"&gt;marble diagrams, select and where&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/02/rx-for-beginners-part-6-merge-expression.aspx" target="_blank"&gt;Merge expression&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/05/rx-for-beginners-part-7-zip-expression.aspx" target="_blank"&gt;Zip expression&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/10/rx-for-beginners-part-8-combine-latest-expression.aspx"&gt;Combine Latest expression&lt;/a&gt;&lt;/strong&gt;&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/13/rx-for-beginners-part-9-hot-vs-cold-observable.aspx"&gt;Hot Vs. Cold observable&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/16/rx-for-beginners-part-10-concat-expression.aspx"&gt;Concat expression&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;Also available&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/23/rx-code-cartoon.aspx" target="_blank"&gt;Code cartoon: Interactive Vs. Reactive&lt;/a&gt; &lt;/li&gt; &lt;/ul&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:d120f734-8fa9-47cc-8ea8-5f2dbe0939b9" 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%2f25%2frx-for-beginners-toc.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%2f25%2frx-for-beginners-toc.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=528056" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="CLR 4" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx" /><category term=".net" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx" /><category term="Rx" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx" /><category term="IObserver" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx" /><category term="Reactive Extensions" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx" /><category term="IObservable" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx" /></entry></feed>