<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?><rss version="2.0"><channel><title>PCR Wiki &amp; Documentation Rss Feed</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=Home</link><description>PCR Wiki Rss Description</description><item><title>UPDATED WIKI: FAQ</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=FAQ&amp;version=20</link><description>&lt;div class="wikidoc"&gt;
&lt;h2&gt;
PCR FAQ
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Why%20PCR%3f&amp;amp;referringTitle=FAQ"&gt;Why PCR?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=When%20did%20the%20PCR%20become%20self%20aware%3f&amp;amp;referringTitle=FAQ"&gt;When did the PCR become self aware?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20Port%3f&amp;amp;referringTitle=FAQ"&gt;What is a Port?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20Selector%3f&amp;amp;referringTitle=FAQ"&gt;What is a Selector?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Can%20I%20update%20UI%20with%20PCR%3f&amp;amp;referringTitle=FAQ"&gt;Can I update UI with PCR?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=How%20is%20this%20similar%20to%20events%3f&amp;amp;referringTitle=FAQ"&gt;How is this similar to events?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=The%20Source%20Readme%3f&amp;amp;referringTitle=FAQ"&gt;The Source Readme?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=How%20does%20locking%20work%3f&amp;amp;referringTitle=FAQ"&gt;How does locking work?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20closure%3f&amp;amp;referringTitle=FAQ"&gt;What is a closure?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20Coroutine%3f&amp;amp;referringTitle=FAQ"&gt;What is a Coroutine?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=When%20is%20port%20processed%20FIFO%20or%20not%3f&amp;amp;referringTitle=FAQ"&gt;When is port processed FIFO or not?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=How%20to%20create%20a%20task%20scheduler%3f&amp;amp;referringTitle=FAQ"&gt;How to create a task scheduler?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Can%20I%20do%20recursion%3f&amp;amp;referringTitle=FAQ"&gt;Can I do recursion?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Is%20there%20a%20Mono%20port%3f&amp;amp;referringTitle=FAQ"&gt;Is there a Mono port?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Cool%20comments%20from%20devs&amp;amp;referringTitle=FAQ"&gt;Cool comments from devs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Fri, 16 Mar 2007 16:39:19 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: FAQ 20070316043919P</guid></item><item><title>UPDATED WIKI: What is a Selector?</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=What is a Selector?&amp;version=5</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;What is a Selector?&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;The best way to think about selectors is with an analogy. A selector is like a query on a collection of objects in a port. If the query matches, the item(s) are removed from the port and the selector is run asyncronously. Using this thinking, a port is the table, the port items are the rows, and a Selector is the SQL query.&lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Fri, 16 Mar 2007 16:34:41 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: What is a Selector? 20070316043441P</guid></item><item><title>UPDATED WIKI: Cool comments from devs</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=Cool comments from devs&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Karloff wrote  Mon at 5:33 PM  delete this comment&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Excellent work and a much needed alternative to CCR for the community who may not be able to utilize commercial licensing of the MS Robotics Runtime components. I look forward to giving the PCR a run. Keep up the fantastic job and thanks!&lt;/i&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Tue, 30 Jan 2007 16:51:49 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Cool comments from devs 20070130045149P</guid></item><item><title>UPDATED WIKI: FAQ</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=FAQ&amp;version=19</link><description>&lt;div class="wikidoc"&gt;
&lt;h2&gt;
PCR FAQ
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Why%20PCR%3f"&gt;Why PCR?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=When%20did%20the%20PCR%20become%20self%20aware%3f"&gt;When did the PCR become self aware?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20Port%3f"&gt;What is a Port?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Can%20I%20update%20UI%20with%20PCR%3f"&gt;Can I update UI with PCR?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Is%20there%20a%20Mono%20port%3f"&gt;Is there a Mono port?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=How%20is%20this%20similar%20to%20events%3f"&gt;How is this similar to events?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20Selector%3f"&gt;What is a Selector?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=The%20Source%20Readme%3f"&gt;The Source Readme?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=How%20does%20locking%20work%3f"&gt;How does locking work?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20closure%3f"&gt;What is a closure?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20Coroutine%3f"&gt;What is a Coroutine?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=When%20is%20port%20processed%20FIFO%20or%20not%3f"&gt;When is port processed FIFO or not?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=How%20to%20create%20a%20task%20scheduler%3f"&gt;How to create a task scheduler?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Can%20I%20do%20recursion%3f"&gt;Can I do recursion?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Cool%20comments%20from%20devs"&gt;Cool comments from devs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Tue, 30 Jan 2007 16:50:54 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: FAQ 20070130045054P</guid></item><item><title>UPDATED WIKI: What is a Port?</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=What is a Port?&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;What is a Port?&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;A port is a container for objects of a type. A port also contains a collection of handlers that will be evaluated in-order when a new item is added to the port. So a port contains both items and selectors(1) as seperate lists. After adding an item, if a selector is satisfied, the matching item(s) are removed from the port and the selector is invoked with the item(s).&lt;br /&gt; &lt;br /&gt;1) A Selector contains logic to pick one or more items from one or more ports.&lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Tue, 30 Jan 2007 16:29:15 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: What is a Port? 20070130042915P</guid></item><item><title>UPDATED WIKI: FAQ</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=FAQ&amp;version=18</link><description>&lt;div class="wikidoc"&gt;
&lt;h2&gt;
PCR FAQ
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Why%20PCR%3f"&gt;Why PCR?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=When%20did%20the%20PCR%20become%20self%20aware%3f"&gt;When did the PCR become self aware?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20Port%3f"&gt;What is a Port?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Can%20I%20update%20UI%20with%20PCR%3f"&gt;Can I update UI with PCR?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Is%20there%20a%20Mono%20port%3f"&gt;Is there a Mono port?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=How%20is%20this%20similar%20to%20events%3f"&gt;How is this similar to events?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20Selector%3f"&gt;What is a Selector?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=The%20Source%20Readme%3f"&gt;The Source Readme?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=How%20does%20locking%20work%3f"&gt;How does locking work?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20closure%3f"&gt;What is a closure?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20Coroutine%3f"&gt;What is a Coroutine?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=When%20is%20port%20processed%20FIFO%20or%20not%3f"&gt;When is port processed FIFO or not?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=How%20to%20create%20a%20task%20scheduler%3f"&gt;How to create a task scheduler?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Can%20I%20do%20recursion%3f"&gt;Can I do recursion?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Tue, 30 Jan 2007 16:21:05 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: FAQ 20070130042105P</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=Home&amp;version=33</link><description>&lt;div class="wikidoc"&gt;
&lt;h4&gt;
What is PCR?
&lt;/h4&gt;Port Concurrency Runtime (PCR) is a Port-Based asyncronous message passing library.&lt;br /&gt; &lt;br /&gt;Simply put, you push messages to ports and the messages are processed (i.e popped) asyncronously using handlers which we call Selectors. All messages (i.e. objects) are sent and received via a &lt;i&gt;Port&lt;/i&gt;.  &lt;i&gt;Selectors&lt;/i&gt; are user defined message handlers that can atomically process a single message or multiple messages from one or more ports based on rules defined by the Selector.  The library includes common selectors that should satisfy the most common patterns such as  &lt;i&gt;SelectOne&lt;/i&gt;, &lt;i&gt;SelectMany&lt;/i&gt;, &lt;i&gt;Choice&lt;/i&gt;, &lt;i&gt;Interleave&lt;/i&gt;, and &lt;i&gt;Join&lt;/i&gt;.&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
        /// &amp;lt;summary&amp;gt;
        /// Test single item selector. SelectOne &amp;quot;can&amp;quot; have a FIFO gaureentee (depending on other factors defined by usage). In this case, only one
        /// selector will be scheduled at a time, but can also be set to run concurrent. The selector will run again when a message is pushed on port.
        /// &amp;lt;/summary&amp;gt;
        static void SelectOneTest()
        {
            // Create a port and add some items.
            Port&amp;lt;string&amp;gt; p = new Port&amp;lt;string&amp;gt;();
            for (int i = 0; i &amp;lt; 20; i++)
                p.Push(i.ToString(&amp;quot;00&amp;quot;));
            int activeCount = 0;
 
            // Create and activate the selector.
            Selector.SelectOne&amp;lt;string&amp;gt;(true, p,
                delegate(string s)
                {
                    if ( Interlocked.Increment(ref activeCount) &amp;gt; 1 )
                        Console.WriteLine(&amp;quot;Error: active count should never go above 1.&amp;quot;);
                    Console.WriteLine(&amp;quot;SelectOneTest: {0} ThreadID:{1:00} Active:{2}&amp;quot;, s, Thread.CurrentThread.ManagedThreadId, activeCount);
                    Thread.Sleep(10);
                    Interlocked.Decrement(ref activeCount);
                }).Add(); 
        }
&lt;/pre&gt; &lt;br /&gt;The above code shows the general pattern that will be used by all selectors.  A port is created, messages are added, and we register a selector query to process messages when they arrive on the port. The PCR runtime handles invoking the selector(s) registered with the port based on the selector rules and message availability. So a selector could run right away or not at all. More complex patterns such as selecting from many ports (i.e. a Join) or selecting many messages from a single port follow the same pattern.  Things like &lt;i&gt;Where&lt;/i&gt; filters are as simple as supplying a predicate delegate to a selector.&lt;br /&gt; &lt;br /&gt;&lt;h5&gt;
Helpful Links
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=FAQ"&gt;PCR FAQ&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://channel9.msdn.com/wiki/default.aspx/Channel9.ConcurrencyRuntime" class="externalLink"&gt;Microsoft CCR&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/CodePlex/Wiki/View.aspx?title=CodePlex%20Wiki%20Markup%20Guide" class="externalLink"&gt;CodePlex Wiki help&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;--&lt;br /&gt;William Stacey [C# MVP]&lt;br /&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Tue, 30 Jan 2007 16:20:24 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20070130042024P</guid></item><item><title>UPDATED WIKI: When is port processed FIFO or not?</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=When is port processed FIFO or not?&amp;version=9</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;When are Port items processed in FIFO order?&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;By itself, a Port has &lt;i&gt;FIFO&lt;/i&gt; queue symantics. Items are added at the end of the port and retrieved from the start of the port. However, &lt;i&gt;Selectors&lt;/i&gt; can change this.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
A Port is FIFO when:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;A Selector's &lt;i&gt;concurrent&lt;/i&gt; flag set to &lt;i&gt;false&lt;/i&gt;. Another handler will not be scheduled until the current handler completes.&lt;/li&gt;&lt;li&gt;No other selectors are attached to the port. Another selector may also grab items from the port. Therefore, in the context of each selector, items could seem to be missing.&lt;/li&gt;&lt;li&gt;No filter (i.e. a Where predicate) is used. A filter &lt;i&gt;explicitly&lt;/i&gt; nullifies the FIFO contract because it can grab items out of order.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;h3&gt;
A Port is &lt;b&gt;not&lt;/b&gt; FIFO when:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;A Selector's &lt;i&gt;concurrent&lt;/i&gt; flag set to &lt;i&gt;true&lt;/i&gt;. This would allow multiple items to be scheduled concurrently. The order of execution is not defined by the OS scheduler.&lt;/li&gt;&lt;li&gt;Multiple selectors are attached to the same port. Selectors would compete for items and the order of execution would be undefined.&lt;/li&gt;&lt;li&gt;A filter is used. A Selector filter, by design, allows for out-of-order processing of items.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Tue, 30 Jan 2007 08:46:05 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: When is port processed FIFO or not? 20070130084605A</guid></item><item><title>UPDATED WIKI: When is port processed FIFO or not?</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=When is port processed FIFO or not?&amp;version=8</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;When are Port items processed in FIFO order?&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;By itself, a Port has &lt;i&gt;FIFO&lt;/i&gt; queue symantics. Items are added at the end of the port and retrieved from the start of the port. However, &lt;i&gt;Selectors&lt;/i&gt; can change this.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
A Port is FIFO when:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;A Selector's &lt;i&gt;concurrent&lt;/i&gt; flag set to &lt;i&gt;false&lt;/i&gt;. Another handler will not be scheduled until the current handler completes.&lt;/li&gt;&lt;li&gt;No other selectors are attached to the port. Another selector may also grab items from the port. Therefore, in the context of each selector, items could seem to be missing.&lt;/li&gt;&lt;li&gt;No filter (i.e. a Where predicate) is used. A filter &lt;i&gt;explicitly&lt;/i&gt; nullifies the FIFO contract because it can grab items out of order.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
A Port is &lt;b&gt;not&lt;/b&gt; FIFO when:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;A Selector's &lt;i&gt;concurrent&lt;/i&gt; flag set to &lt;i&gt;true&lt;/i&gt;. This would allow multiple items to be scheduled concurrently. The order of execution is not defined by the OS scheduler.&lt;/li&gt;&lt;li&gt;Multiple selectors are attached to the same port. Selectors would compete for items and the order of execution would be undefined.&lt;/li&gt;&lt;li&gt;A filter is used. A Selector filter, by design, allows for out-of-order processing of items.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Tue, 30 Jan 2007 08:45:40 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: When is port processed FIFO or not? 20070130084540A</guid></item><item><title>UPDATED WIKI: When is port processed FIFO or not?</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=When is port processed FIFO or not?&amp;version=7</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;When are Port items processed in FIFO order?&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;By itself a Port has &lt;i&gt;FIFO&lt;/i&gt; queue symantics. Items are added at the end of the port and retrieved from the start of the port. However, &lt;i&gt;Selectors&lt;/i&gt; can change this.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
A Port is FIFO when:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;A Selector's &lt;i&gt;concurrent&lt;/i&gt; flag set to &lt;i&gt;false&lt;/i&gt;. Another handler will not be scheduled until the current handler completes.&lt;/li&gt;&lt;li&gt;No other selectors are attached to the port. Another selector may also grab items from the port. Therefore, in the context of each selector, items could seem to be missing.&lt;/li&gt;&lt;li&gt;No filter (i.e. a Where predicate) is used. A filter &lt;i&gt;explicitly&lt;/i&gt; nullifies the FIFO contract because it can grab items out of order.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
A Port is &lt;b&gt;not&lt;/b&gt; FIFO when:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;A Selector's &lt;i&gt;concurrent&lt;/i&gt; flag set to &lt;i&gt;true&lt;/i&gt;. This would allow multiple items to be scheduled concurrently. The order of execution is not defined by the OS scheduler.&lt;/li&gt;&lt;li&gt;Multiple selectors are attached to the same port. Selectors would compete for items and the order of execution would be undefined.&lt;/li&gt;&lt;li&gt;A filter is used. A Selector filter, by design, allows for out-of-order processing of items.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Tue, 30 Jan 2007 08:45:23 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: When is port processed FIFO or not? 20070130084523A</guid></item><item><title>UPDATED WIKI: When is port processed FIFO or not?</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=When is port processed FIFO or not?&amp;version=6</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;When are Port items processed FIFO?&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;By itself a Port has &lt;i&gt;FIFO&lt;/i&gt; queue symantics. Items are added at the end of the port and retrieved from the start of the port. However, &lt;i&gt;Selectors&lt;/i&gt; can change this.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
A Port is FIFO when:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;A Selector's &lt;i&gt;concurrent&lt;/i&gt; flag set to &lt;i&gt;false&lt;/i&gt;. Another handler will not be scheduled until the current handler completes.&lt;/li&gt;&lt;li&gt;No other selectors are attached to the port. Another selector may also grab items from the port. Therefore, in the context of each selector, items could seem to be missing.&lt;/li&gt;&lt;li&gt;No filter (i.e. a Where predicate) is used. A filter &lt;i&gt;explicitly&lt;/i&gt; nullifies the FIFO contract because it can grab items out of order.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
A Port is &lt;b&gt;not&lt;/b&gt; FIFO when:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;A Selector's &lt;i&gt;concurrent&lt;/i&gt; flag set to &lt;i&gt;true&lt;/i&gt;. This would allow multiple items to be scheduled concurrently. The order of execution is not defined by the OS scheduler.&lt;/li&gt;&lt;li&gt;Multiple selectors are attached to the same port. Selectors would compete for items and the order of execution would be undefined.&lt;/li&gt;&lt;li&gt;A filter is used. A Selector filter, by design, allows for out-of-order processing of items.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Tue, 30 Jan 2007 08:45:03 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: When is port processed FIFO or not? 20070130084503A</guid></item><item><title>UPDATED WIKI: When is port processed FIFO or not?</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=When is port processed FIFO or not?&amp;version=5</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;When is Port processed FIFO or not?&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;By itself a Port has &lt;i&gt;FIFO&lt;/i&gt; queue symantics. Items are added at the end of the port and retrieved from the start of the port. However, &lt;i&gt;Selectors&lt;/i&gt; can change this.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
A Port is FIFO when:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;A Selector's &lt;i&gt;concurrent&lt;/i&gt; flag set to &lt;i&gt;false&lt;/i&gt;. Another handler will not be scheduled until the current handler completes.&lt;/li&gt;&lt;li&gt;No other selectors are attached to the port. Another selector may also grab items from the port. Therefore, in the context of each selector, items could seem to be missing.&lt;/li&gt;&lt;li&gt;No filter (i.e. a Where predicate) is used. A filter &lt;i&gt;explicitly&lt;/i&gt; nullifies the FIFO contract because it can grab items out of order.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
A Port is &lt;b&gt;not&lt;/b&gt; FIFO when:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;A Selector's &lt;i&gt;concurrent&lt;/i&gt; flag set to &lt;i&gt;true&lt;/i&gt;. This would allow multiple items to be scheduled concurrently. The order of execution is not defined by the OS scheduler.&lt;/li&gt;&lt;li&gt;Multiple selectors are attached to the same port. Selectors would compete for items and the order of execution would be undefined.&lt;/li&gt;&lt;li&gt;A filter is used. A Selector filter, by design, allows for out-of-order processing of items.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Tue, 30 Jan 2007 08:44:37 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: When is port processed FIFO or not? 20070130084437A</guid></item><item><title>UPDATED WIKI: When is port processed FIFO or not?</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=When is port processed FIFO or not?&amp;version=4</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;When is Port processed FIFO or not?&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;By itself a Port has &lt;i&gt;FIFO&lt;/i&gt; queue symantics. Items are added at the end of the port and retrieved from the start of the port. However, &lt;i&gt;Selectors&lt;/i&gt; can change this.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
A Port is FIFO when:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Selector concurrent flag set to false. Another item will not be scheduled until first one completes.&lt;/li&gt;&lt;li&gt;No other selectors attached to port. Another selector may also grab items from the port. So in the context of each selector, items would be missing.&lt;/li&gt;&lt;li&gt;No filter (i.e. Where) used. A filter explicitly nullifies the fifo contract because it can grap items out of order based on what item in the port matches.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;h3&gt;
a Port is Not FIFO when:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;The Selector concurrent flag set to true. This would allow multiple items to be scheduled concurrently. The order of execution is not defined by the OS scheduler.&lt;/li&gt;&lt;li&gt;Multiple selectors are attached to the same port. Selectors would &lt;i&gt;compete&lt;/i&gt; for items and the order of execution would be undefined.&lt;/li&gt;&lt;li&gt;A filter is used. A filter allows out-of-order processing of items by design.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Tue, 30 Jan 2007 08:35:09 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: When is port processed FIFO or not? 20070130083509A</guid></item><item><title>UPDATED WIKI: Can I do recursion?</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=Can I do recursion?&amp;version=2</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Can I do recursion with Ports?&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Sure. This is more an inherent ability of the loose nature of ports. You can keep posting messages to ports from anywhere in your program, so you can get interesting and powerful recursion abilities. Here is a TreeWalk sample that demonstrates this:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
        /// &amp;lt;summary&amp;gt;
        /// Note how easy it is to do recursion. Because this uses stack-less recursion we don't have to
        /// worry about stack overflow. However, we now have a different challenge - &amp;quot;How do we ever know
        /// when we are actually complete because there is no stack to unwind?&amp;quot;
        /// &amp;lt;/summary&amp;gt;
        private static void TreeWalk()
        {
		    
            Port&amp;lt;DirectoryInfo&amp;gt; dirPort = new Port&amp;lt;DirectoryInfo&amp;gt;();
            Port&amp;lt;FileInfo&amp;gt; filesPort = new Port&amp;lt;FileInfo&amp;gt;();
 
            DirectoryInfo root = new DirectoryInfo(@&amp;quot;c:\windows&amp;quot;);
            if (!root.Exists)
            {
                Console.WriteLine(&amp;quot;Root does not exist.&amp;quot;);
                return;
            }
            dirPort.Push(root);    // Start at c:\temp.
 
            long folders = 0;
            Selector.SelectOne(true, dirPort,
                delegate(DirectoryInfo di)
                {
                    foreach (FileInfo fi in di.GetFiles())
                        filesPort.Push(fi);
                    foreach (DirectoryInfo di2 in di.GetDirectories())
                    {
                        folders++;
                        dirPort.Push(di2);
                    }
                }).Add();
 
            long totSize = 0;
            long files = 0;
            Console.WriteLine(&amp;quot;Files in tree:&amp;quot;);
            Selector.SelectOne(true, filesPort,
                delegate(FileInfo fi)
                {
                    files++;
                    totSize += fi.Length;
                    Console.WriteLine(fi.FullName);
                }).Add();
 
            // Output.
            Thread.Sleep(2000); // Guess we are complete by now. How to tell when done?
            Console.WriteLine(&amp;quot;Size    :  {0:n0} bytes.&amp;quot;, totSize);
            Console.WriteLine(&amp;quot;Contains:  {0:n0} Files, {1:n0} Folders.&amp;quot;, files, folders);
        }
&lt;/pre&gt; &lt;br /&gt;Also see WikiPedia on &lt;a href="http://en.wikipedia.org/wiki/Recursion" class="externalLink"&gt;Recursion&lt;/a&gt;&lt;br /&gt;-- &lt;br /&gt;William&lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Sun, 28 Jan 2007 19:34:37 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Can I do recursion? 20070128073437P</guid></item><item><title>UPDATED WIKI: How is this similar to events?</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=How is this similar to events?&amp;version=4</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;How is this similar to events?&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Actually, that is one way to think about the PCR. You could actually replace events with Ports. An event has a delegate with some signature that is called by some producer code. In a similar way, you can register handlers with a port. When an object is added to a port, the registered handlers (i.e. selectors) are evaluated to determine a match. If a match, the selector is run on a thread pool thread.&lt;br /&gt; &lt;br /&gt;There are also some fundemental differences:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;You don't explicity call handlers in the PCR, you just post messages on a Port which is a non-blocking operation. The port will queue the item and will schedule a matching selector to run the handler.&lt;/li&gt;&lt;li&gt;Selectors are automatically scheduled on the thread pool, not run in the context of the producer.&lt;/li&gt;&lt;li&gt;Ports provide a clean and clear seperation between data and code that operates on that data. The port becomes the interface, and you just pass messages between any number of services just by having a reference to a port. This allows very loose coupling between layers and/or services within an application.&lt;/li&gt;&lt;li&gt;Selectors can have many forms of arbitration associated with them. Selectors can be joined together, they can return one to many items, they can have attached filters, etc. In a sense, this is a form of event overloading.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Sun, 28 Jan 2007 19:33:18 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: How is this similar to events? 20070128073318P</guid></item><item><title>UPDATED WIKI: Can I update UI with PCR?</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=Can I update UI with PCR?&amp;version=5</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Can update UI with the PCR?&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Good question. This is such a common need that we implemented it.&lt;br /&gt;Actually, it was pretty easy and we did not have to special case the selectors. We derived another dispatch queue class from DispatchQueueBase that is UI specific (i.e. UIDispatchQueue). So instead of queuing work to a thread pool, we directly queue the work items on the windows message queue. The cool part is you can use selector arbitration as normal, so you can do things like wait on multiple items for performance reasons or other. You can see an example of this in the GuiProgress form in the PcrChat project. Below is the code (there is a smaller sample at end of page):&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Wjs.Pcr;
using System.Threading;
 
namespace PcrChat
{
    public partial class GuiProgress : Form
    {
        private Port&amp;lt;WorkStatus&amp;gt; progressPort = new Port&amp;lt;WorkStatus&amp;gt;();
        private volatile bool cancel;
 
        public GuiProgress()
        {
            InitializeComponent();
            InitProgress();
        }
 
        private void StartWorker(string path)
        {
            // Note, we have no gui logic in our worker. This keeps it loosely coupled from UI.
            // We could also use an Interleave here.
            Port&amp;lt;string&amp;gt; wp = new Port&amp;lt;string&amp;gt;();
            wp.Push(path);
            Selector.SelectOne(true, wp,
                delegate(string name)
                {
                    for (int i = 1; i &amp;lt;= 100; i++)
                    {
                        if (this.cancel)
                        {
                            this.progressPort.Push(new WorkStatus(name, -1));
                            return;
                        }
                        Thread.Sleep(30);   // Sim work.
                        progressPort.Push(new WorkStatus(name, i));
                    }
                }).Add();
        }
 
        private void InitProgress()
        {
            // The progress selector has the UI knowledge.
            // Note we are not using any BeginInvokes, events, monitors, or pulses; just
            // plain message passing. This should ultimately simplify your code.
            Selector.SelectOne(true, progressPort,
                delegate(WorkStatus ws)
                {
                    // We are running on the UI thread here so take care not to do blocking calls.
                    if (ws.Value == -1)
                    {
                        Console.WriteLine(&amp;quot;Worker cancelled.&amp;quot;);
                        Reset();
                        return;
                    }
                    if (ws.Name == &amp;quot;Work1&amp;quot;)
                        this.progressBar1.Value = ws.Value;
                    else
                        this.progressBar2.Value = ws.Value;
                    if (this.progressBar1.Value == 100 &amp;amp;&amp;amp; this.progressBar2.Value == 100)
                    {
                        MessageBox.Show(&amp;quot;Complete&amp;quot;);
                        Reset();
                    }
                }).Add(new UIDispatchQueue(this)); // Note use of UIDispatchQueue.
        }
 
        private void btnStartWork_Click(object sender, EventArgs e)
        {
            // Start two workers.
            this.btnStartWork.Enabled = false;
            StartWorker(&amp;quot;Work1&amp;quot;);
            StartWorker(&amp;quot;Work2&amp;quot;);
            this.btnCancel.Enabled = true;
        }
 
        private void Reset()
        {
            this.progressBar1.Value = 0;
            this.progressBar2.Value = 0;
            this.progressBar1.Style = ProgressBarStyle.Blocks;
            this.progressBar2.Style = ProgressBarStyle.Blocks;
            this.btnStartWork.Enabled = true;
            this.btnCancel.Enabled = false;
            this.cancel = false;
        }
 
        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.btnCancel.Enabled = false;
            this.cancel = true;
        }
    }
 
    internal class WorkStatus
    {
        public string Name;
        public int Value;
 
        public WorkStatus(string name, int value)
        {
            this.Name = name;
            this.Value = value;
        }
    }
}
&lt;/pre&gt; &lt;br /&gt;Here is simple console sample that demos the general idea without all the UI stuff in the way:&lt;br /&gt;&lt;pre&gt;
        private static void UITest2()
        {
            // Do some work on worker thread(s), then post results back to UI thread.
            // In this case, our UI is console, but same idea applies.
 
            Port&amp;lt;int&amp;gt; uiPort = new Port&amp;lt;int&amp;gt;();
            Port&amp;lt;int&amp;gt; workerPort = new Port&amp;lt;int&amp;gt;();
 
            // This handler does async wait for work. No blocked threads.
            Selector.SelectOne(true, true, workerPort,
                delegate(int i)
                {
                    // I am doing some work on a TP thread.
                    i = i + 2;
                    uiPort.Push(i); // Post results to UI.
                }).Add();
 
            // This handler does async wait for UI result. Again, no blocked threads or polling.
            Selector.SelectOne(true, true, uiPort,
                delegate(int i)
                {
                    // Update Form control, etc.
                    Console.WriteLine(&amp;quot;UI: &amp;quot; + i);
                }).Add(new UIDispatchQueue());
 
            // Post some work tasks. Can be called from any thread.
            workerPort.Push(1);
            workerPort.Push(2);
        }
&lt;/pre&gt; &lt;br /&gt;-- William&lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Sun, 28 Jan 2007 19:32:59 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Can I update UI with PCR? 20070128073259P</guid></item><item><title>UPDATED WIKI: Is there a Mono port?</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=Is there a Mono port?&amp;version=3</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Is there a Mono port?&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Not yet, but would like one. Care to help?&lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Sun, 28 Jan 2007 19:32:35 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Is there a Mono port? 20070128073235P</guid></item><item><title>UPDATED WIKI: When did the PCR become self aware?</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=When did the PCR become self aware?&amp;version=3</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;When did the PCR become self aware?&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Sunday, January 07, 2007 3:41:48:12.69 AM Zulu&lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Sun, 28 Jan 2007 19:31:23 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: When did the PCR become self aware? 20070128073123P</guid></item><item><title>UPDATED WIKI: Can I do recursion?</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=Can I do recursion?&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
Sure. This is more an inherent ability of the loose nature of ports. You can keep posting messages to ports from anywhere in your program, so you can get interesting and powerful recursion abilities. Here is a TreeWalk sample that demonstrates this:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
        /// &amp;lt;summary&amp;gt;
        /// Note how easy it is to do recursion. Because this uses stack-less recursion we don't have to
        /// worry about stack overflow. However, we now have a different challenge - &amp;quot;How do we ever know
        /// when we are actually complete because there is no stack to unwind?&amp;quot;
        /// &amp;lt;/summary&amp;gt;
        private static void TreeWalk()
        {
		    
            Port&amp;lt;DirectoryInfo&amp;gt; dirPort = new Port&amp;lt;DirectoryInfo&amp;gt;();
            Port&amp;lt;FileInfo&amp;gt; filesPort = new Port&amp;lt;FileInfo&amp;gt;();
 
            DirectoryInfo root = new DirectoryInfo(@&amp;quot;c:\windows&amp;quot;);
            if (!root.Exists)
            {
                Console.WriteLine(&amp;quot;Root does not exist.&amp;quot;);
                return;
            }
            dirPort.Push(root);    // Start at c:\temp.
 
            long folders = 0;
            Selector.SelectOne(true, dirPort,
                delegate(DirectoryInfo di)
                {
                    foreach (FileInfo fi in di.GetFiles())
                        filesPort.Push(fi);
                    foreach (DirectoryInfo di2 in di.GetDirectories())
                    {
                        folders++;
                        dirPort.Push(di2);
                    }
                }).Add();
 
            long totSize = 0;
            long files = 0;
            Console.WriteLine(&amp;quot;Files in tree:&amp;quot;);
            Selector.SelectOne(true, filesPort,
                delegate(FileInfo fi)
                {
                    files++;
                    totSize += fi.Length;
                    Console.WriteLine(fi.FullName);
                }).Add();
 
            // Output.
            Thread.Sleep(2000); // Guess we are complete by now. How to tell when done?
            Console.WriteLine(&amp;quot;Size    :  {0:n0} bytes.&amp;quot;, totSize);
            Console.WriteLine(&amp;quot;Contains:  {0:n0} Files, {1:n0} Folders.&amp;quot;, files, folders);
        }
&lt;/pre&gt; &lt;br /&gt;Also see WikiPedia on &lt;a href="http://en.wikipedia.org/wiki/Recursion" class="externalLink"&gt;Recursion&lt;/a&gt;&lt;br /&gt;-- &lt;br /&gt;William&lt;br /&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Fri, 26 Jan 2007 18:38:42 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Can I do recursion? 20070126063842P</guid></item><item><title>UPDATED WIKI: FAQ</title><link>http://www.codeplex.com/PCR/Wiki/View.aspx?title=FAQ&amp;version=17</link><description>&lt;div class="wikidoc"&gt;
&lt;h2&gt;
PCR FAQ
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Why%20PCR%3f"&gt;Why PCR?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=When%20did%20the%20PCR%20become%20self%20aware%3f"&gt;When did the PCR become self aware?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Can%20I%20update%20UI%20with%20PCR%3f"&gt;Can I update UI with PCR?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Is%20there%20a%20Mono%20port%3f"&gt;Is there a Mono port?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=How%20is%20this%20similar%20to%20events%3f"&gt;How is this similar to events?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20Selector%3f"&gt;What is a Selector?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=The%20Source%20Readme%3f"&gt;The Source Readme?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=How%20does%20locking%20work%3f"&gt;How does locking work?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20closure%3f"&gt;What is a closure?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=What%20is%20a%20Coroutine%3f"&gt;What is a Coroutine?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=When%20is%20port%20processed%20FIFO%20or%20not%3f"&gt;When is port processed FIFO or not?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=How%20to%20create%20a%20task%20scheduler%3f"&gt;How to create a task scheduler?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/PCR/Wiki/View.aspx?title=Can%20I%20do%20recursion%3f"&gt;Can I do recursion?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>staceyw</author><pubDate>Fri, 26 Jan 2007 18:35:49 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: FAQ 20070126063549P</guid></item></channel></rss>