<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Bnaya Eshet : Queue</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Queue/default.aspx</link><description>Tags: Queue</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>New version of Rx Contrib</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/14/new-version-of-rx-contrib.aspx</link><pubDate>Fri, 14 May 2010 17:09:53 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:618170</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;Rx Contrib has new version (1.3)&lt;/h2&gt;  &lt;p&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, Reactive, IObservable, IObserver, ISubject" border="0" alt="Rx, Reactive, IObservable, IObserver, ISubject" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/RxContrib_674B59C0.jpg" width="122" height="111" /&gt;&lt;/p&gt;  &lt;h5&gt;Release Notes&lt;/h5&gt;  &lt;p&gt;- Bug Fix    &lt;br /&gt;- &lt;strong&gt;BufferWithTimeOrCount&lt;/strong&gt; with flexible time period enabled     &lt;br /&gt;when ever the time period elapsed it will use the &lt;strong&gt;lamda&lt;/strong&gt; for getting the next period&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;this feature is a join effort of &lt;b&gt;Amir Shitrit&lt;/b&gt; and &lt;b&gt;Bnaya Eshet&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0745ced6-9e37-4562-8061-d340b45407d9" 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:#2b91af;"&gt;IObservable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;long&lt;/span&gt;&amp;gt; obs = &lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.Interval(&lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromMilliseconds(10));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; bufferQueue = obs.BufferWithTimeOrCount(() =&amp;gt; &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromMilliseconds(500), 10);&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;&amp;#160;&lt;/p&gt;  &lt;p&gt;you can download the source or binaries from &lt;a href="http://rxcontrib.codeplex.com/" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;you can install the &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx" target="_blank"&gt;Rx&lt;/a&gt; (the Rx framework is a prerequisite) from &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f14%2fnew-version-of-rx-contrib.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f14%2fnew-version-of-rx-contrib.aspx" /&gt;&lt;/a&gt; &lt;a href="http://dotnetshoutout.com/New-version-of-Rx-Contrib-Export-Bnaya-Eshet"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fblogs.microsoft.co.il%2Fblogs%2Fbnaya%2Farchive%2F2010%2F05%2F14%2Fnew-version-of-rx-contrib.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=618170" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx">Rx</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx">IObserver</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx">Reactive Extensions</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx">Parallel</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx">IObservable</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Queue/default.aspx">Queue</category></item><item><title>Performance tips</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/04/performance-tips.aspx</link><pubDate>Tue, 04 May 2010 23:53:57 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:610291</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;Performance tips&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1264595994_blueclock_1D8A8748.jpg"&gt;&lt;img style="border-right-width:0px;margin:0px 15px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Reactive Queue, IObservable, Performance, ManualResetEventSlim , WaitHandle" border="0" alt="Reactive Queue, IObservable, Performance, ManualResetEventSlim , WaitHandle" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/1264595994_blueclock_thumb_67C51C20.jpg" width="106" height="106" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;recently I was working on the &lt;strong&gt;&lt;a href="http://rxcontrib.codeplex.com/" target="_blank"&gt;Reactive Queue&lt;/a&gt;&lt;/strong&gt; (which is part of the &lt;strong&gt;Rx Contrib&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;the requirement for the &lt;strong&gt;Reactive Queue&lt;/strong&gt; was to to achieve the &lt;strong&gt;highest throughput possible&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;for each queue provider (&lt;font color="#808080"&gt;2,000,000 messages of 500 byte per second using Concurrent Queue provider &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;running on simple quad server&lt;/font&gt;).&lt;/p&gt;  &lt;p&gt;while working on this project I was encounter the the following performance hits:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;1. ManualResetEventSlim&lt;/h5&gt;  &lt;p&gt;there is a big difference between using the old &lt;strong&gt;ManualResetEvent&lt;/strong&gt; Vs. &lt;strong&gt;ManualResetEventSlim &lt;/strong&gt;the hit&lt;/p&gt;  &lt;p&gt;factor can go up to &lt;strong&gt;2 or 3 times slower&lt;/strong&gt; if you having a very short synchronization period &lt;/p&gt;  &lt;p&gt;(&lt;font color="#808080"&gt;the &lt;strong&gt;ManualResetEventSlim &lt;/strong&gt;does not escalate to kernel mode on short period waiting&lt;/font&gt;).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;2. ManualResetEventSlim.WaitHandle &lt;/h5&gt;  &lt;p&gt;do not expose the &lt;strong&gt;ManualResetEventSlim&lt;/strong&gt; instance using the &lt;strong&gt;WaitHandle&lt;/strong&gt;, as shown in the following code 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:11159ba4-48a9-46ac-a4aa-fb7717c39e25" 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:#ffdfbf;margin:0 0 0 2em;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;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ManualResetEventSlim&lt;/span&gt; _syncWhileWorkingHandle;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;WaitHandle&lt;/span&gt; WaitWhileWorkingHandle&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _syncWhileWorkingHandle.WaitHandle; }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;consuming &lt;strong&gt;ManualResetEventSlim&lt;/strong&gt; though its &lt;strong&gt;WaitHandle&lt;/strong&gt; property does not gain&lt;/p&gt;  &lt;p&gt;performance improvements benefits.&lt;/p&gt;  &lt;p&gt;if you do want to expose &lt;strong&gt;synchronization API&lt;/strong&gt;, use 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:98bdacfc-fe5c-4325-856e-93e45077021b" 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;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ManualResetEventSlim&lt;/span&gt; _syncWhileWorkingHandle;&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;void&lt;/span&gt; WaitWhileWorking()&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;_syncWhileWorkingHandle.Wait();&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;h5&gt;3. CancellationToken &lt;/h5&gt;  &lt;p&gt;when ever using &lt;strong&gt;CancellationToken:&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:01b3b56f-18a6-4cce-bc26-8a0b83f63950" 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;var&lt;/span&gt; cancel = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CancellationTokenSource&lt;/span&gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;.Factory.StartNew(Dequeuing, cancel.Token);&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;do monitor &lt;strong&gt;GC collect&lt;/strong&gt; counter, especially the &lt;strong&gt;3rd generation&lt;/strong&gt; collection.&lt;/p&gt;  &lt;p&gt;trying to use this technique I got a &lt;strong&gt;huge hit&lt;/strong&gt; (3.5 times slower), because of&lt;/p&gt;  &lt;p&gt;extra (multiple) GC 3rd generation collection.&lt;/p&gt;  &lt;p&gt;instead of using the &lt;strong&gt;CancellationToken&lt;/strong&gt; the &lt;strong&gt;Reactive Queue&lt;/strong&gt; is using old good &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;dispose&lt;/strong&gt; pattern.&lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;h5&gt;4. Thread.Yield()&lt;/h5&gt;  &lt;p&gt;do consider to use &lt;strong&gt;Thread.Yield().&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;putting it on the right places may improve overall performance, &lt;/p&gt;  &lt;p&gt;but you have to be careful and measure the actual performance, because&lt;/p&gt;  &lt;p&gt;doing it on the wrong places may result as performance hit. &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;Summary&lt;/h5&gt;  &lt;p&gt;performance improving required &lt;strong&gt;continuously measurement &lt;/strong&gt;which should&lt;/p&gt;  &lt;p&gt;be compared with historical measurement.&lt;/p&gt;  &lt;p&gt;be &lt;strong&gt;careful with synchronization&lt;/strong&gt; and do use the new .net synchronization types like &lt;strong&gt;ManualResetEventSlim.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f04%2fperformance-tips.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f04%2fperformance-tips.aspx" /&gt;&lt;/a&gt; &lt;a href="http://dotnetshoutout.com/Performance-tips-Export-Bnaya-Eshet"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fblogs.microsoft.co.il%2Fblogs%2Fbnaya%2Farchive%2F2010%2F05%2F04%2Fperformance-tips.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=610291" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/expert/default.aspx">expert</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx">Rx</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx">IObserver</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx">Reactive Extensions</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx">Parallel</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx">IObservable</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Queue/default.aspx">Queue</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Performance/default.aspx">Performance</category></item><item><title>Rx Contrib</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/05/01/rx-contrib.aspx</link><pubDate>Sat, 01 May 2010 22:57:52 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:606478</guid><dc:creator>bnaya</dc:creator><slash:comments>1</slash:comments><description>&lt;h2&gt;Rx Contrib&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/RxContrib_674B59C0.jpg"&gt;&lt;img style="border-right-width:0px;margin:10px 20px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="RxContrib" border="0" alt="RxContrib" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/RxContrib_thumb_5134C861.jpg" width="110" height="100" /&gt;&lt;/a&gt; release V1&lt;/h2&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;Rx Contrib&lt;/strong&gt; is ongoing effort of &lt;strong&gt;community extensions&lt;/strong&gt; for &lt;strong&gt;Rx&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;you can can find the project at &lt;a title="http://rxcontrib.codeplex.com/" href="http://rxcontrib.codeplex.com/"&gt;http://rxcontrib.codeplex.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Current features are:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ReactiveQueue&lt;/strong&gt;: is ISubject that &lt;strong&gt;does not loose values&lt;/strong&gt; if there are &lt;strong&gt;no subscribers&lt;/strong&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The &lt;strong&gt;reactive queue&lt;/strong&gt; is using the &lt;strong&gt;IQueueAdapter&lt;/strong&gt; for injecting concrete &lt;/p&gt;    &lt;p&gt;queue adapters (which mean that it can be extend to support other queues).&lt;/p&gt;    &lt;p&gt;the out of the box implementation is using &lt;strong&gt;ConcurrentQueue&lt;/strong&gt; which have &lt;strong&gt;extreme throughput&lt;/strong&gt;.&lt;/p&gt;    &lt;p&gt;(up to 2,000,000 messages of 500 byte per second on basic quad server).&lt;/p&gt;    &lt;p&gt;It is also support&lt;strong&gt; Weak Subscribe&lt;/strong&gt; option which holds the subscriber using &lt;strong&gt;week reference&lt;/strong&gt;, &lt;/p&gt;    &lt;p&gt;(those &lt;strong&gt;subscription&lt;/strong&gt; will be &lt;strong&gt;removed after&lt;/strong&gt; it been &lt;strong&gt;collected&lt;/strong&gt; by the &lt;strong&gt;GC&lt;/strong&gt;).&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h5&gt;Add contribution&lt;/h5&gt;  &lt;p&gt;If you want to &lt;strong&gt;contribute&lt;/strong&gt; to this efforts, you can contact &lt;a href="mailto:bnayae@sela.co.il"&gt;bnayae@sela.co.il&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Credits&lt;/h5&gt;  &lt;p&gt;The&lt;strong&gt; Reactive Queue&lt;/strong&gt;, &lt;strong&gt;Weak Subscription&lt;/strong&gt;, &lt;strong&gt;Unsubscribe Disposable&lt;/strong&gt; are join effort of &lt;strong&gt;Bnaya Eshet&lt;/strong&gt; and &lt;strong&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/yuvmaz/" target="_blank"&gt;Yuval Mazor&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Yuval Mazor blog: &lt;a href="http://blogs.microsoft.co.il/blogs/yuvmaz/"&gt;http://blogs.microsoft.co.il/blogs/yuvmaz/&lt;/a&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;Read more about &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx" target="_blank"&gt;Rx&lt;/a&gt;&lt;/h5&gt;  &lt;p&gt;&lt;a title="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-toc.aspx" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-toc.aspx"&gt;http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-toc.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://dotnetshoutout.com/Rx-Contrib-Export-Bnaya-Eshet"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fblogs.microsoft.co.il%2Fblogs%2Fbnaya%2Farchive%2F2010%2F05%2F01%2Frx-contrib.aspx" /&gt;&lt;/a&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f01%2frx-contrib.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f05%2f01%2frx-contrib.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=606478" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx">Rx</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx">IObserver</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx">Reactive Extensions</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx">Parallel</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx">IObservable</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Queue/default.aspx">Queue</category></item></channel></rss>