<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5384926102484105713</id><updated>2011-07-08T05:01:50.849-03:00</updated><category term='VB11'/><category term='exceptions'/><category term='wishlist'/><category term='yield'/><category term='solution'/><category term='asymptotic-complexity'/><category term='Tasks'/><category term='Linq'/><category term='mistakes'/><category term='Iterator'/><category term='VB10'/><category term='.net'/><category term='notation'/><category term='streams'/><category term='puzzle'/><category term='VB'/><category term='assumptions'/><category term='concurrency'/><category term='complexity'/><category term='ideas'/><title type='text'>Turing Machines are Programs</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-7069171841944430316</id><published>2010-04-11T14:50:00.004-03:00</published><updated>2010-04-11T15:04:02.782-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wishlist'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='VB11'/><title type='text'>VB11 Wish List - Part 1</title><content type='html'>With the  release of visual studio 2010 coming this week, it's high time to  publish wish lists. The Visual Basic .Net of today has come a long way  from the BASIC of yonder old days, and not all of it involves making the  name longer. However, there's still so much that could be done, or  could be done better. These are my wishes and my ideas, and hopefully  they will affect Microsoft's decision process in some small way.  Unfortunately, I have so many ideas there's no way they could all be  implemented. Oh well, here we go!&lt;br /&gt; &lt;br /&gt;&lt;b&gt;#1) Public-Get/Private-Set and ReadOnly Auto  Properties&lt;/b&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;One of the features introduced in VB10, and  imported from C#, is auto properties. Unfortunately, VB10 auto  properties are quite limited compared to their C# counterparts. It is  impossible to specify an auto property with a private setter and a  public getter (Oh well, at least it's only the&lt;b&gt; most common case &lt;/b&gt;(sigh)).  It's also not possible to create a ReadOnly auto property, which is odd  considering auto properties otherwise act like variables (mostly).&lt;br /&gt; &lt;br /&gt;I want the ability to  define auto properties with different access levels on the getter and  setter and ReadOnly (fixed at construction) auto properties. I suggest  the following syntax:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#008000;"&gt;'Public getter, private setter&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Get&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Set&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt; Value &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#008000;"&gt;'Fixed after  construction time&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;ReadOnly&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt; Value &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;#2)  Flexible 'Implements'&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;You've probably had this happen to you before: you  want to implement something from an interface, but your class doesn't  quite match. You have a function but you need a property, you have a  property but you need a ReadOnly property, you have a function but you  need a subroutine or a function with a weaker return type, etc, etc. You  work around the problem by implementing the interface member using a  private function/sub/property which delegates to your existing stuff.&lt;br /&gt; &lt;br /&gt;All of these  not-really-a-mismatch cases should be allowed. The compiler should  transparently implement the boilerplate code to match the interface  member to the implementing construct.&lt;br /&gt; &lt;br /&gt;&lt;b&gt;#3) Infer Redundant Operators&lt;/b&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;Implementing a  comparison operator without its partner currently causes a compile  error. If you define '=' but not '&lt;&gt;', or '&lt;' but not '&gt;',  or '&lt;=' but not '&gt;=', or vice versa, then you get a completely  unnecessary compile error. I hate that compile error. The missing  operator is trivial: invert the arguments for an ordering operator or  invert the result for an equality operator. The compiler should be doing  these trivial transformations for you. Defining an equality operator  and an ordering operator should give you all of the comparison  operators, no questions asked. At the very least, operators' partners  should be inferred.&lt;br /&gt; &lt;br /&gt;&lt;b&gt;#4) Comparison Operator: &lt;=&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Ruby has a very nice  comparison operator: &lt;=&gt;. It returns the sign of comparing two  values: -1 when the first argument is less, +1 when it is greater, and 0  when it is equal. I'd like to see it in VB/.Net.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;Select Case&lt;/span&gt; value1 &lt;=&gt;  value2&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;Case&lt;/span&gt; -1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;Case&lt;/span&gt;  0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;Case&lt;/span&gt; +1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;End Select&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;#5)  Iterator Blocks&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;I'm very surprised this didn't make it into VB10. I  know the VB team had &lt;a href="http://www.panopticoncentral.net/archive/2008/08/08/24155.aspx"&gt;excellent  ideas&lt;/a&gt; about it at least as far back as 2008. Iterator blocks?  Awesome!&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:&amp;quot;courier new&amp;quot;;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;Function  &lt;/span&gt;FromTo(&lt;span style="color:#0000ff;"&gt;ByVal &lt;/span&gt;low &lt;span style="color:#0000ff;"&gt;As Integer&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;ByVal &lt;/span&gt;high  &lt;span style="color:#0000ff;"&gt;As Integer&lt;/span&gt;) &lt;span style="color:#0000ff;"&gt;As &lt;/span&gt;IEnumerable(&lt;span style="color:#0000ff;"&gt;Of Integer&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;quot;courier new&amp;quot;;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;Return Iterator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;quot;courier new&amp;quot;;"&gt;&lt;span style="font-size:85%;"&gt;                   &lt;span style="color:#0000ff;"&gt;If &lt;/span&gt;low &lt;= high &lt;span style="color:#0000ff;"&gt;Then&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;quot;courier new&amp;quot;;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;                        Return &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;quot;courier new&amp;quot;;"&gt;&lt;span style="font-size:85%;"&gt;low&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;quot;courier new&amp;quot;;"&gt;&lt;span style="font-size:85%;"&gt;                       &lt;span style="color:#0000ff;"&gt;Return Each &lt;/span&gt;FromTo(low  + 1, high)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;quot;courier new&amp;quot;;"&gt;&lt;span style="font-size:85%;"&gt;                   &lt;span style="color:#0000ff;"&gt;End If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;quot;courier new&amp;quot;;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;                End Iterator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;quot;courier  new&amp;quot;;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;End Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#6) Linq  Zip Operator&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;I  often want to zip sequences together, but I have to break the linq flow  and use explicit calls to Enumerable.Zip. There should be a linq  operator for zipping:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;Dim&lt;/span&gt;  evenItems = &lt;span style="color:#0000ff;"&gt;From&lt;/span&gt; item &lt;span style="color:#0000ff;"&gt;In&lt;/span&gt;  items&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                     &lt;span style="color:#0000ff;"&gt;Zip&lt;/span&gt; index &lt;span style="color:#0000ff;"&gt;In&lt;/span&gt;  Naturals&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                     &lt;span style="color:#0000ff;"&gt;Where&lt;/span&gt; index &lt;span style="color:#0000ff;"&gt;Mod&lt;/span&gt;  2 = 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                     &lt;span style="color:#0000ff;"&gt;Select&lt;/span&gt; item&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;#7) IDisposable Event Subscriptions&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;You should clean up  your event handlers. Failure to do so can result in memory leaks  (handlers can't be garbage collected while a long-lived event dispatcher  has a reference to them). Just ask the Princeton team from the 2007  DARPA challenge, because &lt;a href="http://developers.slashdot.org/developers/07/11/17/0552247.shtml"&gt;they  had exactly this type of memory leak&lt;/a&gt;. So, ideally, removing event  handlers should be as painless as possible.&lt;br /&gt; &lt;br /&gt;Unfortunately, removing event handlers isn't  painless. First, every properly removed handler requires three lines  (store delegate, add delegate, remove delegate). You must store the  delegate you are going to add and remove, because otherwise you will try  to remove an equivalent-but-different delegate and end up removing  nothing. Second, every RemoveHandler line is an identical copy of an  AddHandler line, except you replace the 'Add' prefix with 'Remove'.  Finally, you add and remove events in different parts of the code, which  makes it harder to keep the add/remove lines synced.&lt;br /&gt; &lt;br /&gt;In order to overcome  the far-away-sync pain, I started using the following pattern for event  subscriptions: package the RemoveHandler call into a delegate, and  package that inside an IDisposable. You end up with a 'subscription',  which can be disposed to remove the event handler. Therefore, instead of  using RemoveHandler, you dispose the subscription. This enormously  simplifies removing groups of event handlers, because you can keep all  the subscriptions in a list of IDisposable. For example:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;Dim&lt;/span&gt;  handler = &lt;span style="color:#0000ff;"&gt;AddressOf&lt;/span&gt; SomeMethod&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;AddHandler&lt;/span&gt;  SomeObject.SomeEvent, handler&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;Me.&lt;/span&gt;subscriptions.Add(&lt;span style="color:#0000ff;"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DelegatedDisposable&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;() &lt;span style="color:#0000ff;"&gt;RemoveHandler&lt;/span&gt;  SomeObject.SomeEvent, handler))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    ... elsewhere, in the disposal code  ...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;For Each&lt;/span&gt; subscription &lt;span style="color:#0000ff;"&gt;In Me&lt;/span&gt;.Subscriptions&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        subscription.Dispose()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;    Next&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Unfortunately, you still have to track the  delegate (albeit in a hoisted local instead of a class member), and you  still have to repeat yourself in the RemoveHandler call. All of this  would be solved if 'AddHandler' returned an IDisposable which, when  disposed, removed the added handler. There would be no more need to  track the delegate or repeat the handler arguments. Instead of three  lines of code per handler, you end up with just one: &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;    Me.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;subscriptions.Add(&lt;span style="color:#0000ff;"&gt;AddHandler&lt;/span&gt;  SomeObject.SomeEvent, &lt;span style="color:#0000ff;"&gt;AddressOf&lt;/span&gt;  SomeMethod)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;To Be Continued&lt;/b&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-7069171841944430316?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/7069171841944430316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2010/04/vb11-wish-list-part-1-with-release-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/7069171841944430316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/7069171841944430316'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2010/04/vb11-wish-list-part-1-with-release-of.html' title='VB11 Wish List - Part 1'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-4293398451836726549</id><published>2010-03-12T18:06:00.000-04:00</published><updated>2010-03-12T18:17:46.316-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tasks'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><title type='text'>Linq to Tasks</title><content type='html'>One of the more interesting properties of the Linq syntax is that, at  heart, it has nothing to do with sequences or XML or SQL. Linq is a  really syntax for performing operations with monads, and you can add  your own types to it relatively easily. (For the uninitiated: a monad is  essentially a wrapper class plus a way to transform functions to use  wrapped values instead of normal values). Linq works with sequences  because sequences are an extremely common Monad, and so the linq-to-list  stuff is implemented as part of .Net. In this post, I'm going to show  you an example of adding your own Linq-to-X functionality. &lt;br /&gt; &lt;br /&gt;Tasks are a new  feature in .Net 4.0. A task represents an asynchronous operation, such  as a function running on another thread, and provides methods for  working with the eventual result. You can use the ContinueWith methods  to chain tasks together, feeding the eventual output of one task into  the input of another task. For our purposes, the important thing is that  tasks are a monad: they wrap a value, and you can modify functions to  operate on tasks instead of normal values (using ContinueWith).&lt;br /&gt; &lt;br /&gt;Since tasks are a type  of monad, we can use them with Linq. All we have to do is define the  necessary extension methods: Select and SelectMany. Select is the  function used when you have a single 'From' line in your query, while  SelectMany is used when there are multiple 'From' lines. Our  task-version of Select will take a task and a function, and return a  task for the function's eventual result after being given the task's  eventual value. SelectMany is essentially the same thing, but with two  tasks and two functions.&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;    Imports&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt; System.Threading.Tasks&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Module&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;LinqToTasks&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &amp;lt;&lt;span style="color:#2b91af;"&gt;Extension&lt;/span&gt;()&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;Function&lt;/span&gt; [Select](&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt;  TArg, TResult)(&lt;span style="color:#0000ff;"&gt;ByVal&lt;/span&gt; task &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TArg&lt;/span&gt;),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                    &lt;span style="color:#0000ff;"&gt;ByVal&lt;/span&gt; func &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt;  &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TArg&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;TResult&lt;/span&gt;)) &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TResult&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;Return&lt;/span&gt;  task.ContinueWith(&lt;span style="color:#0000ff;"&gt;Function&lt;/span&gt;(t)  func(t.Result), &lt;span style="color:#2b91af;"&gt;TaskContinuationOptions&lt;/span&gt;.OnlyOnRanToCompletion)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &amp;lt;&lt;span style="color:#2b91af;"&gt;Extension&lt;/span&gt;()&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;Function&lt;/span&gt; SelectMany(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt;  TArg, TMid, TReturn)(&lt;span style="color:#0000ff;"&gt;ByVal&lt;/span&gt; task &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TArg&lt;/span&gt;),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                            &lt;span style="color:#0000ff;"&gt;ByVal&lt;/span&gt; projection1 &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt;  &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TArg&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TMid&lt;/span&gt;)),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                            &lt;span style="color:#0000ff;"&gt;ByVal&lt;/span&gt; projection2 &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt;  &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TArg&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;TMid&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;TReturn&lt;/span&gt;)) &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TReturn&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;Return&lt;/span&gt;  task.Select(&lt;span style="color:#0000ff;"&gt;Function&lt;/span&gt;(value1)  projection1(value1).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                        Select(&lt;span style="color:#0000ff;"&gt;Function&lt;/span&gt;(value2)  projection2(value1, value2))).Unwrap&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Module&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;I know that doesn't seem like a lot of code, but  that's all of it. We can now use the linq syntax on tasks. But keep in  mind that we didn't implement many of the operators, like "where" (what  would that even mean for a task?). Here are some examples of using the  linq syntax on tasks:&lt;br /&gt; &lt;br /&gt;Example #1: Returns a task that evaluates to 35  after five seconds:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;Function&lt;/span&gt; TaskTest() &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt;  &lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Int32&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;Dim&lt;/span&gt; t = &lt;span style="color:#0000ff;"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TaskCompletionSource&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Int32&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;Call&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;New&lt;/span&gt; System.Threading.&lt;span style="color:#2b91af;"&gt;Thread&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                  System.Threading.&lt;span style="color:#2b91af;"&gt;Thread&lt;/span&gt;.Sleep(5000)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                  t.SetResult(5)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                              &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;).Start()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;Return&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;From&lt;/span&gt; value &lt;span style="color:#0000ff;"&gt;In&lt;/span&gt;  t.Task&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:#0000ff;"&gt;Let&lt;/span&gt; squared = value * value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                   &lt;span style="color:#0000ff;"&gt;Let&lt;/span&gt;  doubled = value + value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                   &lt;span style="color:#0000ff;"&gt;Select&lt;/span&gt; squared  + doubled&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;         &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;Example #2: Returns a task that evaluates to 20  after ten seconds:&lt;br /&gt; &lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;Function&lt;/span&gt; TaskTest2() &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt;  &lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Int32&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;Dim&lt;/span&gt; t = &lt;span style="color:#0000ff;"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TaskCompletionSource&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Int32&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;Call&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;New&lt;/span&gt; System.Threading.&lt;span style="color:#2b91af;"&gt;Thread&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                  System.Threading.&lt;span style="color:#2b91af;"&gt;Thread&lt;/span&gt;.Sleep(5000)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                  &lt;span style="color:#0000ff;"&gt;Dim&lt;/span&gt; t2 = &lt;span style="color:#0000ff;"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TaskCompletionSource&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt;  &lt;span style="color:#2b91af;"&gt;Int32&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                  t.SetResult(t2.Task)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                  System.Threading.&lt;span style="color:#2b91af;"&gt;Thread&lt;/span&gt;.Sleep(5000)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                  t2.SetResult(1)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                             &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;).Start()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;Return&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;From&lt;/span&gt; taskValue &lt;span style="color:#0000ff;"&gt;In&lt;/span&gt;  t.Task&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:#0000ff;"&gt;From&lt;/span&gt; value &lt;span style="color:#0000ff;"&gt;In&lt;/span&gt;  taskValue&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:#0000ff;"&gt;Select&lt;/span&gt; value * 20&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;As you have seen, allowing linq syntax on a type is  as easy as implementing extension methods for the operators. A good  learning exercise is to implement the linq operators for the non-generic  version of IEnumerable (hint: all the functions involve enumerating).  There are tons of types you can linq-ify: collection types, nullables,  Lazy&amp;lt;t&amp;gt;, delegates like Func&amp;lt;t&amp;gt;, etc, etc, etc and etc. Try  not to overdo it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-4293398451836726549?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/4293398451836726549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2010/03/linq-to-tasks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/4293398451836726549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/4293398451836726549'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2010/03/linq-to-tasks.html' title='Linq to Tasks'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-5231991033892591695</id><published>2010-03-05T13:29:00.004-04:00</published><updated>2010-03-05T13:42:08.744-04:00</updated><title type='text'>Post-Mortem of a Job Application</title><content type='html'>&lt;p class="MsoNoSpacing"&gt;I applied for a job recently, and was asked to  write a small clone of Arkanoid (aka Breakout) using C++/DirectX. My C++  was rusty and the last DirectX stuff I did was five years ago and in  VB6, but I figured I might as well try. At least it would refresh my C++  and force me to learn some DirectX. Unfortunately, I never managed to  finish the game (on time). My lack of familiarity caused difficulties  but, looking back, I can see that familiarity was not the issue.  Learning sucked up some time, but the real time sink came about because  of a design decision made only three hours into the project: I decided  to write a Rational class instead of using floating point values.&lt;/p&gt;&lt;p class="MsoNoSpacing"&gt; &lt;/p&gt;&lt;p class="MsoNoSpacing"&gt;Since this was a job  application, I didn't want to do the bare minimum. I came up with the  idea to record 'ghosts', so you could race against yourself. If I had  the time, I could even feed the ghost data in live from another game for  some relatively simple networked multiplayer. Thinking about how I  would implement this, I remembered that floating points are not reliable  in terms of consistency. Small optimizations made by the compiler, and  differences across machines, can make the results of even simple  additions come out slightly differently. That could be a problem,  so I decided to write a Rational class and use it instead of floating  points. That way I could guarantee consistency across machines.&lt;/p&gt;&lt;p class="MsoNoSpacing"&gt; &lt;/p&gt;&lt;p class="MsoNoSpacing"&gt;At the beginning, I  was reaping benefits. The rationals weren't as fast as floats, since  constructing one involved computing a gcd, but the game wasn't even  close to taxing the CPU. They even made the physics nice and exact, because  all the 2d vector operations I used are closed over the rationals (No  rounding errors. At all!). For example, this code computes the *exact*  intersection point and normal of a moving point into a line segment:&lt;/p&gt;&lt;pre&gt;&lt;p class="MsoNoSpacing"&gt; &lt;/p&gt;&lt;p class="MsoNoSpacing"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="color:#008000;"&gt;&lt;span style="font-size:85%;"&gt;//[example note: Vector2 is an x/y pair  of Rationals. CollisionPoint is a location/normal pair which can be  empty for no collision]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;CollisionPoint CollisionPoint :: PointIntoLine(&lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; Vector2 p, &lt;span style="color:#0000ff;"&gt;const&lt;/span&gt;  Vector2 dp,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                &lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; Vector2 q1, &lt;span style="color:#0000ff;"&gt;const&lt;/span&gt;  Vector2 q2) {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;     assert(dp != Vector2(0, 0));&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    assert(q1 != q2);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#008000;"&gt;//Useful  intermediate values&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    Vector2 p1 = p;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    Vector2 p2 = p + dp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    Vector2 dq = q2 - q1;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    Rational f1 = q1.Cross(q2);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    Rational f2 = p1.Cross(p2);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#008000;"&gt;//Intersection  point (of lines extended to infinity)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    Rational d = dp.Cross(dq);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (d  == 0) &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; CollisionPoint(); &lt;span style="color:#008000;"&gt;//no collision due to parallel lines&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    Rational cx = (f1*dp.X() -  f2*dq.X())/d;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;     Rational cy = (f1*dp.Y() - f2*dq.Y())/d;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    Vector2 intersectionPoint =  Vector2(cx, cy);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#008000;"&gt;//Confirm that the intersection  point is within the segments&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;  (Median(p1.X(), cx, p2.X()) != cx || &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        Median(p1.Y(), cy, p2.Y()) != cy  ||&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;         Median(q1.X(), cx, q2.X()) != cx ||&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;        Median(q1.Y(), cy, q2.Y()) != cy)  &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; CollisionPoint(); &lt;span style="color:#008000;"&gt;//missed&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#008000;"&gt;//return the  point of impact and the normal of the line the at point of impact&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;  CollisionPoint(intersectionPoint, - dp.PerpOnto(q2 - q1));&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;/pre&gt;&lt;/p&gt;&lt;p class="MsoNoSpacing"&gt;The happy times continued until I hit an assert:  "denominator &amp;lt; 0". I had decided that a rational's negative sign must always be on the numerator, and put an assert in the constructor to enforce this. Upon first seeing the error, I thought I had made some stupid error in one of the operator functions. Unfortunately, what had happened was far more insidious: integer overflow. &lt;p class="MsoNoSpacing"&gt; &lt;/p&gt;&lt;p class="MsoNoSpacing"&gt;The thing to  understand about rationals is that performing operations on them tends  to make them 'share' their factors. If you add a/b and c/d, you get (ad +  bc)/(bd), which almost always has a larger denominator and numerator  even after removing the gcd. In the worst case each addition will square  the numerator and denominator, and you only have to square five times  to go from 2 to 2^32 and cause an overflow. Well guess what: a physics  function involves way more than five additions, not to mention other  operations.&lt;/p&gt;&lt;p class="MsoNoSpacing"&gt; &lt;/p&gt;&lt;p class="MsoNoSpacing"&gt;I  tried to smooth over the problem by rounding, but the problem kept  happening. I rounded more aggressively, but it kept happening.  Eventually I had rounding statements on practically every other line  outside of the physics functions, but it still kept happening. Even my  goat sacrifice to Apollo didn't work (maybe he doesn't like goats?). You  could pick a physics function at random, give it touchy input, and  cause an assertion. To make matters worse, all this tinkering and  rounding kept introducing small bugs. Eventually I ran way over on time,  and gave up.&lt;/p&gt;&lt;p class="MsoNoSpacing"&gt; &lt;/p&gt;&lt;p class="MsoNoSpacing"&gt;If  I had gone with the tried-and-true floating points, I would have  finished with a potentially-maybe-slightly-out-of-sync ghost, instead of  not finishing at all. The lesson I'm taking from all of this is that I  shouldn't be experimenting with ideas when I'm on the clock, unless it's  necessary. Sometimes they work, but when they don't the cost is too  high. Perhaps, now that there's no time limit, I'll rewrite the  rationals to use BigIntegers in order to guarantee there are no  overflows. That could be an interesting side project.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-5231991033892591695?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/5231991033892591695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2010/03/post-mortem-of-job-application.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/5231991033892591695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/5231991033892591695'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2010/03/post-mortem-of-job-application.html' title='Post-Mortem of a Job Application'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-1950975862312455411</id><published>2010-01-04T17:34:00.004-04:00</published><updated>2010-01-04T17:43:49.503-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='notation'/><category scheme='http://www.blogger.com/atom/ns#' term='asymptotic-complexity'/><category scheme='http://www.blogger.com/atom/ns#' term='ideas'/><title type='text'>Asymptotic Notation is Complex</title><content type='html'>&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-CA&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;    &lt;w:usefelayout/&gt;   &lt;/w:Compatibility&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-priority:99;  mso-style-qformat:yes;  mso-style-parent:"";  mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-para-margin-top:0cm;  mso-para-margin-right:0cm;  mso-para-margin-bottom:10.0pt;  mso-para-margin-left:0cm;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"Times New Roman";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNoSpacing"&gt;Have you ever struggled with Big-O notation? I used to. If I saw "n = O(n^2)", I perceived "n equals O applied to n^2". It took time to train my mind to instead perceive "n is asymptotically less than n^2". It never caused any serious problems, it was just an incredibly annoyance. I used to think I was the problem, but now I realize the notation was the problem. In large part this realization comes from reading "The Design of Everyday Things", which talks about people blaming themselves for the failings of the common objects around them. It's time to face facts: Big-O notation sucks.&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt; &lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;There are two main problems with Big-O notation: it looks like an equality (it's not), and the symbols are arbitrary (w.r.t. the rest of math). The first problem is by far the worse. Big-O notation is meant to express an ordering, not an equality. Using an equality to represent an ordering is a travesty of usability. It encourages you to make contradictory proofs like: 1 = O(1), 2 = O(1), therefore 1 = 2. You might as well switch a car's gas and brake pedals. The second problem is a learnability issue. If I know what Big-O means, and I see a Big-Omega, I can't infer what that means. I need to memorize all five symbols (o, O, &lt;span&gt;θ, Ω, ω), and their meaning&lt;/span&gt; (Do you know what they all mean?). These problems have real consequences. There are many perpetually renewed questions on CS forums about the notation for asymptotic complexity, instead of about asymptotic complexity itself.&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt; &lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;Since Big-O notation is so bad, let's design a replacement. We want to express an ordering, so we will use the standard ordering operators (&lt;, &lt;=, =, &gt;=, &gt;). We want it to look distinct, so we'll modify the operators in some way (eg. prefix them with an @ for &lt;u&gt;a&lt;/u&gt;symp&lt;u&gt;t&lt;/u&gt;otic). That's it! The new notation is:&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;[F(x) = o(G(x))] === [F(x) @&amp;lt; G(x)]&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNoSpacing"&gt;[F(x) = O(G(x))] === [F(x) @&lt;= G(x)]&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;[F(x) = &lt;span&gt;θ&lt;/span&gt; (G(x))] === [F(x) @= G(x)]&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;[F(x) = &lt;span&gt;Ω&lt;/span&gt; (G(x))] === [F(x) @&gt;= G(x)]&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;[F(x) = &lt;span&gt;ω&lt;/span&gt; (G(x))] === [F(x) @&gt; G(x)]&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;Do you see how much clearer it makes the whole affair? It is now &lt;b&gt;obvious&lt;/b&gt; that we are dealing with an ordering, &lt;b&gt;obvious&lt;/b&gt; that [F(x) @&lt;= G(x)] is the opposite of [F(x) @&gt; G(x)], and &lt;b&gt;obvious&lt;/b&gt; that [F(x) @= G(x)] is equivalent to [F(x) @&lt;= G(x) and F(x) @&gt;= G(x)]. All of the non-obvious parts have been isolated into the '@' symbol. In fact, I bet the notation just taught some people what little-omega (&lt;span&gt;ω)&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;means.&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt; &lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;Here are some examples, using the above notation:&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;1 @&lt;= 2&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;1 @= 10000&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;1 @&amp;lt; n&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNoSpacing"&gt;2*n @&lt;= n&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;n^2 @&lt;= n^10000&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;2^n @&gt; n&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;3^n @&gt; 2^n&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;Isn't that much nicer than Big-O notation? I hope that something similar to the above will replace Big-O in the future. I'm tired of telling people what Big-Omega means.&lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt; &lt;/p&gt;  &lt;p class="MsoNoSpacing"&gt;As a closing note, I want to point out how awkward the usual asymptotic complexity definitions are. Proving [&lt;span&gt;Ǝc&gt;0,e&gt;0.&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;∀x&gt;e.F(x)&lt;=c*G(x)] is usually a lot harder than proving lim(x to inf)(F(x)/G(x)) converges.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-1950975862312455411?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/1950975862312455411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2010/01/asymptotic-notation-is-complex.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/1950975862312455411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/1950975862312455411'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2010/01/asymptotic-notation-is-complex.html' title='Asymptotic Notation is Complex'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-5134586612769211233</id><published>2009-12-30T13:36:00.004-04:00</published><updated>2009-12-30T13:42:02.442-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solution'/><title type='text'>Solution - Asymmetric Latency</title><content type='html'>The robots cannot figure out which room they are in, and they cannot distinguish the symmetric case from asymmetric cases. They can measure the round trip time, but never the one-way trip time.&lt;br /&gt;&lt;br /&gt;Consider that the robots' actions are determined entirely by previously sent and received messages. Delay all messages by five seconds, and a robot's response will be five seconds later. Therefore, if we delay all incoming messages by five seconds, and accelerate all outgoing messages by five seconds, the net delay on the response is 0 seconds. Changing the symmetric case of 2s/2s to 1s/3s will have no effect on the robots' actions because the net delay is unchanged. They cannot tell the cases apart.&lt;br /&gt;&lt;br /&gt;It is easier to understand this proof visually. Suppose the delays were equal. Then the propagation of messages might look like this:&lt;br /&gt;&lt;br /&gt;&lt;a style="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_IdZIYasmgVI/SzuQIEeWmOI/AAAAAAAAABY/Q1htRn3V8_A/s1600-h/RobotEqualDelay.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 123px;" src="http://4.bp.blogspot.com/_IdZIYasmgVI/SzuQIEeWmOI/AAAAAAAAABY/Q1htRn3V8_A/s400/RobotEqualDelay.png" alt="" id="BLOGGER_PHOTO_ID_5421085044784928994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Changing the one-way delay while holding the round-trip time constant is equivalent to sliding one of the timelines. The exact same case, except with all of the delay in one direction, looks like this:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_IdZIYasmgVI/SzuQIXmSt4I/AAAAAAAAABg/oe_xoQRpvps/s1600-h/RobotOneWayDelay.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 127px;" src="http://1.bp.blogspot.com/_IdZIYasmgVI/SzuQIXmSt4I/AAAAAAAAABg/oe_xoQRpvps/s400/RobotOneWayDelay.png" alt="" id="BLOGGER_PHOTO_ID_5421085049918502786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Notice that, from the robots' perspective, both cases are equivalent. A2 arrives the same amount of time after A1, B2 arrives the same amount of time after B1, etc. In fact we can make one of the directions have a negative delay (go back in time) and the robots still can't tell the difference (the round trip time is still positive)!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-5134586612769211233?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/5134586612769211233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/12/solution-asymmetric-latency.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/5134586612769211233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/5134586612769211233'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/12/solution-asymmetric-latency.html' title='Solution - Asymmetric Latency'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_IdZIYasmgVI/SzuQIEeWmOI/AAAAAAAAABY/Q1htRn3V8_A/s72-c/RobotEqualDelay.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-4621698468926318056</id><published>2009-12-23T02:18:00.001-04:00</published><updated>2009-12-23T02:20:37.270-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='puzzle'/><title type='text'>Puzzle - Asymmetric Latency</title><content type='html'>Suppose two robots are placed in separate isolated rooms, called A and B. They can communicate, but the communication delay is not symmetric: it takes one second for a message to travel from room B to room A, but three seconds for a message to travel from room A to room B. The robots do not know which room they are in, and they do not have synchronized clocks. The only information they share is some preconceived plan/program for sending messages and responses.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_IdZIYasmgVI/SzG1_lhGpcI/AAAAAAAAABQ/ucol8_67ACg/s1600-h/Delay.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 253px;" src="http://4.bp.blogspot.com/_IdZIYasmgVI/SzG1_lhGpcI/AAAAAAAAABQ/ucol8_67ACg/s400/Delay.png" alt="" id="BLOGGER_PHOTO_ID_5418311930710762946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Questions:&lt;/span&gt;&lt;br /&gt;1) Can the robots figure out which rooms they are in?&lt;br /&gt;2T) If so, could they figure out the exact values of the one way latencies?&lt;br /&gt;2F) If not, could they at least distinguish cases where the latency is asymmetric from cases where the latency is equal both ways?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-4621698468926318056?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/4621698468926318056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/12/puzzle-asymmetric-latency.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/4621698468926318056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/4621698468926318056'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/12/puzzle-asymmetric-latency.html' title='Puzzle - Asymmetric Latency'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_IdZIYasmgVI/SzG1_lhGpcI/AAAAAAAAABQ/ucol8_67ACg/s72-c/Delay.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-1091076439818240876</id><published>2009-11-10T21:01:00.002-04:00</published><updated>2009-11-10T21:09:22.157-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assumptions'/><category scheme='http://www.blogger.com/atom/ns#' term='complexity'/><title type='text'>The Assumptions We Make</title><content type='html'>I loved my algorithms courses in university. The material just 'clicked' and I did extremely well. But, one day awhile after I had finished the course, a thought about hashing occurred. I realized I had been making some very serious assumptions when analyzing algorithmic complexity. This post covers two of those assumptions.&lt;br /&gt;&lt;br /&gt;The thought, restructured to actually follow a logical argument, goes something like this: hash tables can't be constant time. There's just no way. If a hash function takes constant time then its output has constant size. If the output has size N, then a table using that output has maximum size 2^N. If the table has a maximum size then we can overflow it by just adding more and more items (ie. it will eventually degenerate into linear time searches of the bins). What's going on?!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Constant Word Size&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The constant word size assumption is the assumption that, even though you may have an unbounded number of unique items, they can still have constant size and can still be manipulated in constant time. Copying, comparing, swapping, and a bunch of other operations we often assume are constant time would necessarily become more expensive with huge input sizes.&lt;br /&gt;&lt;br /&gt;Suppose you want to sort 2^2048 items (clearly this is a thought experiment!). If each of those items is unique, they must each have a unique binary representation. So, on average, each item must use at least 2048 bits. It suddenly becomes clear that comparing items can't be O(1), but must be at least O(lg n) [because the items have O(lg n) bits].&lt;br /&gt;&lt;br /&gt;Let's analyze merge sort using this new realization. It should be immediately obvious that merging becomes more expensive: merging two sublists of size L from a list of size N requires O(L * lg n) time. Since we must merge sublists whose combined size is O(N) for O(lg n) levels before the list is sorted, merge sort will take O(N * (lg n) * (lg n)) time. Wait, what?! Merge sort is O(n lg n), not O(n lg^2 n)! What's going on?!&lt;br /&gt;&lt;br /&gt;What's going on is the constant word size assumptions. The O(n lg n) bound actually applies to the number of comparisons you have to perform, not the total computational time. They just happen to coincide exceedingly well in practice (eg. I doubt anyone will ever actually sort 2^64 unique items, certainly never 2^128 unique items).&lt;br /&gt;&lt;br /&gt;Essentially every algorithm has a hidden theoretical O(lg n) word-size factor hidden away. Once I realized this, my constant-time hashing dilemma went away. It's the exact same issue, except I was focusing on the output size instead of the input size.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;RAM Model vs Physics&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Perhaps the most ingrained assumption is the random-access memory model, where memory is unbounded with a constant access time. Unlike the constant word size assumption, this assumption was at least stated in my algorithms course. But reality is, of course, not so forgiving.&lt;br /&gt;&lt;br /&gt;You can only fit so much information into a given area, and distance from the processor lower bounds the time it takes to retrieve a bit of information. A sphere with volume N has radius O(N^(1/3)), so accessing a particular bit of data is not just O(lg n), it's O(n^(1/3))! [I remember reading a black hole will eventually form if you exceed O(surface area), so it could even be O(n^(1/2))!]&lt;br /&gt;&lt;br /&gt;I don't even want to think about what that does to the time complexity of sorting or hashing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's a bit unsettling to realize I'd been ignoring all these logarithmic factors, and that no one had ever mentioned them to me. Oh well, at least it doesn't matter in practice... Actually, the word size of processors has actually exceeded the increases in the size of data, subtly reinforcing the constant-size assumption.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-1091076439818240876?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/1091076439818240876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/11/assumptions-we-make.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/1091076439818240876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/1091076439818240876'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/11/assumptions-we-make.html' title='The Assumptions We Make'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-787707320148882202</id><published>2009-09-28T16:50:00.000-03:00</published><updated>2009-09-28T17:00:20.888-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='streams'/><category scheme='http://www.blogger.com/atom/ns#' term='mistakes'/><title type='text'>.Net Design Mistakes - Streams</title><content type='html'>For the most part, .Net is a great framework. But it has its share of "WTF?" classes and design decisions. In this series I will cover (vent) these objective (subjective) faults. Today I am covering the mess better known as System.IO.Stream: a class trying to be five interfaces at once. Let's dive right in and cover the major problems.&lt;br /&gt; &lt;br /&gt; &lt;b&gt;Problem #1: Tedious to Implement&lt;/b&gt;&lt;br /&gt; &lt;b&gt; &lt;/b&gt;&lt;br /&gt; Suppose I want to implement a stream that flips the bits of a substream. Sounds pretty simple, but here is what comes out:&lt;br /&gt; &lt;pre&gt;&lt;br /&gt; &lt;span style=";font-family:Consolas;color:blue;"  &gt;&lt;span style="font-size:85%;"&gt;Public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;BinaryNotStream&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; IO.&lt;span style="color: rgb(43, 145, 175);"&gt;Stream&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; substream &lt;span style="color:blue;"&gt;As&lt;/span&gt; IO.&lt;span style="color: rgb(43, 145, 175);"&gt;Stream&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; substream &lt;span style="color:blue;"&gt;As&lt;/span&gt; IO.&lt;span style="color: rgb(43, 145, 175);"&gt;Stream&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;If&lt;/span&gt; substream &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"substream"&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Not&lt;/span&gt; substream.CanRead &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"substream"&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.substream = substream&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Read(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; buffer() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Byte&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; offset &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; count &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; n = substream.Read(buffer, offset, count)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;For&lt;/span&gt; i = offset &lt;span style="color:blue;"&gt;To&lt;/span&gt; offset + n - 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            buffer(i) = &lt;span style="color:blue;"&gt;Not&lt;/span&gt; buffer(i)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Next&lt;/span&gt; i&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Return&lt;/span&gt; n&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; CanRead &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Protected&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Dispose(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; disposing &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;If&lt;/span&gt; disposing &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            substream.Dispose()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.Dispose(disposing)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; CanSeek &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; CanWrite &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Flush()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Length &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Long&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;NotSupportedException&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Position &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Long&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;NotSupportedException&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Set&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Long&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;NotSupportedException&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Seek(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; offset &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Long&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; origin &lt;span style="color:blue;"&gt;As&lt;/span&gt; System.IO.&lt;span style="color: rgb(43, 145, 175);"&gt;SeekOrigin&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Long&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;NotSupportedException&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; SetLength(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Long&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;NotSupportedException&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Write(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; buffer() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Byte&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; offset &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; count &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;NotSupportedException&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style=";font-family:Consolas;color:blue;"  &gt;&lt;span style="font-size:85%;"&gt;End&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; Allow me to summarize my reaction to this: AAAAAAAAAAAAAAAUUUUUUUUUUUUUUUUUUUUUUGGGHHH! Half of the code is throwing NotSupportedExceptions (which is appropriate!)! Pick almost any stream class and you'll find this "NotSupported" boilerplate code. It is a pain to write, a pain to read, and guarantees even dead simple stream class are at least a few dozen lines.&lt;br /&gt; &lt;br /&gt; &lt;b&gt;Problem #2: Guess the Type&lt;/b&gt;&lt;br /&gt; &lt;br /&gt; It boggles the mind that a class must call itself a 'stream' when it can't actually do two thirds of the things a 'stream' does. There is no way to tell the type system a class is a "readable" stream, and no way to require a readable stream parameter. When you implement a function that accepts a stream, you must check that the stream supports reading by querying CanRead. Otherwise, an exception will be thrown when you try to use the stream (possibly much later). Technically, a stream could even change from readable to writable during execution.&lt;br /&gt; &lt;br /&gt; Many .net streams change their readability based on arguments given to their constructor. For example, the file stream is not a readable stream and it is not a writable stream. The file stream is a "readable and/or writable" stream (depending on the open type specified). Similarly, the compression streams are "readable xor writable" streams (when compressing you may only write and when decompressing you may only read).&lt;br /&gt; &lt;br /&gt; Because of this type flexibility, many of the stream classes have too many responsibilities. Poor DeflateStream has to both compress and decompress data, even though those operations have very different behaviours. Similarly, FileStream has to enforce read/write permissions at runtime instead of just relying on the type system.&lt;br /&gt; &lt;br /&gt; &lt;b&gt;Problem #3: Redundant Redundancy&lt;/b&gt;&lt;br /&gt; &lt;br /&gt; First, streams have a Position property and a Seek method and both have to be implemented, despite the fact that Seek can be implemented entirely in terms of Position and Length. Every time you implement a seekable stream, you re-implement Seek exactly the same way as last time. What a waste of code, and what a great way to introduce blind copy-paste bugs.&lt;br /&gt; &lt;br /&gt; Second, streams have an overridable Close method and a Dispose method. Here are their implementations in IO.Stream according to Reflector:&lt;br /&gt; &lt;pre&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;virtual&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Close() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Dispose(&lt;span style="color:blue;"&gt;true&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;GC&lt;/span&gt;.SuppressFinalize(&lt;span style="color:blue;"&gt;this&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Dispose() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Close();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;/pre&gt;&lt;br /&gt; I think they assumed programmers would find it easier to understanding "closing" a stream as opposed to "disposing" a stream. This was a bad idea. Not only does it create confusion (is disposing equivalent to closing?) and add cruft, it implies you can later re-"open" the stream (you can't). Actually, this issue was mentioned in a Microsoft channel 9 show about the upcoming Linq-to-Events/Reactive-framework (as one of the reasons they decided to only use Dispose).&lt;br /&gt; &lt;br /&gt; &lt;b&gt;Problem #4: Not an Interface&lt;/b&gt;&lt;br /&gt; &lt;br /&gt; Extension methods didn't exist when the stream class was designed and implemented, so the only way to include derived methods (eg. ReadByte uses Read) 'within' a type was an overridable class (I am guessing at Microsoft's reasoning, of course).&lt;br /&gt; &lt;br /&gt; I don't really fault Microsoft for this problem: they probably chose the best option at the time. However, times have changed and there are downsides to using classes instead of interfaces. Classes don't allow multiple inheritance, which is probably why there is a single stream type instead of multiple (eg. ReadableStream, WriteableStream). It also means implementers can't be derived from a non-stream base class, which is annoying because sometimes "oh, and you can use it like a stream" is a feature you want to tack onto an existing class.&lt;br /&gt; &lt;br /&gt; &lt;b&gt;Proposed Solution&lt;/b&gt;&lt;br /&gt; &lt;br /&gt; Split IO.Stream's various responsibilities into interfaces:&lt;br /&gt; &lt;pre&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IReadableStream&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IDisposable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Read(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; buffer() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Byte&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; offset &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; count &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IWritableStream&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IDisposable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Write(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; buffer() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Byte&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; offset &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; count &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Flush()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ISeekableStream&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IDisposable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Position &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Long&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Length &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Long&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; IO.Stream can implement the interfaces for forwards compatibility. Extension methods, which wrap stream interface instances inside an IO.Stream, provide backwards compatibility. Extension methods can implement the derived methods from IO.Stream:&lt;br /&gt;  &lt;pre&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;&lt;span style="color: rgb(43, 145, 175);"&gt;Extension&lt;/span&gt;()&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; ReadByte(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; this &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IReadableStream&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; this &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"this"&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; buffer(0 &lt;span style="color:blue;"&gt;To&lt;/span&gt; 0) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Byte&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; n = this.Read(buffer, 0, 1)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; n = 0 &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; -1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; buffer(0)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; Eventually, IO.Stream can be deprecated.&lt;br /&gt; &lt;br /&gt; Furthermore, define interfaces for combinations of responsibilities:&lt;br /&gt; &lt;pre&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IRereadableStream&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IReadableStream&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ISeekableStream&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IRewritableStream&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IWritableStream&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ISeekableStream&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;br /&gt; The result is the same functionality we have now, except type safe. You no longer need to check if a stream is readable, you no longer need to throw NotSupportExceptions, and you no longer need to write blog posts about how bad streams are.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-787707320148882202?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/787707320148882202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/09/net-design-mistakes-streams.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/787707320148882202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/787707320148882202'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/09/net-design-mistakes-streams.html' title='.Net Design Mistakes - Streams'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-5822005987912450523</id><published>2009-09-15T15:51:00.002-03:00</published><updated>2009-09-15T15:57:01.432-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='exceptions'/><title type='text'>Exceptions to Die By - The InvalidStateException</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;   &lt;br /&gt;  When your program fails, you want to throw the right type of exception. You want to provide useful information in the type so the caller can react appropriately to the problem. Lack of type information is one reason why throwing an exception of type Exception is such a bad idea. The .net base class library includes exceptions for most common cases (ArgumentException, InvalidOperationException, IOException, etc.). This post covers a class of custom exceptions I like to use in my own projects, which I call invalid state exceptions.&lt;br /&gt;   &lt;br /&gt;  &lt;b&gt;Description&lt;/b&gt;&lt;br /&gt;   &lt;br /&gt;  Most bugs immediately cause an exception to be thrown: if you try to pass null into a non-null method you get an ArgumentNullException, and if you try to pop an empty stack and you get an InvalidOperationException. But the difficult bugs don't throw exceptions immediately: they occur, corrupt the program state, and at some later point this causes an exception to be thrown. &lt;br /&gt;   &lt;br /&gt;  Enter the &lt;i&gt;InvalidStateException&lt;/i&gt;. An invalid state exception occurs when the program fails because a state-corrupting bug has &lt;b&gt;already occurred&lt;/b&gt;. For example, a list enumeration failing because the list was modified should be an InvalidStateException instead of an InvalidOperationException.&lt;br /&gt;  &lt;pre&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Indicates an invalid program state has been detected (eg. due to a fault).&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvalidStateException&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvalidOperationException&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;Optional&lt;/span&gt; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; message &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                       &lt;span style="color: blue;"&gt;Optional&lt;/span&gt; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; innerException &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Exception&lt;/span&gt; = &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.New(&lt;span style="color: blue;"&gt;If&lt;/span&gt;(message, &lt;span style="color: rgb(163, 21, 21);"&gt;"Reached an unexpected state."&lt;/span&gt;), innerException)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;/pre&gt;&lt;br /&gt;  Invalid state exceptions are generally irrecoverable because it is already too late to fix the problem. They tend to indicate bugs in the interaction of multiple components, and are usually thrown by assumption-checking code. I have found that adding this exception type has increased the amount of assumption checking code I write, which is definitely a good thing.&lt;br /&gt;   &lt;br /&gt;  &lt;b&gt;Derived Types&lt;/b&gt;&lt;br /&gt;   &lt;br /&gt;  Usually we know more than just "the program is in an invalid state" when throwing an invalid state exception. The most common assumption I check is that a switch statement hits a defined case, so I have a derived type called ImpossibleValueException. Here are the three derived types I have used:&lt;br /&gt;   &lt;br /&gt;  &lt;p class="MsoNoSpacing" style="margin-left: 36pt;"&gt;1.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-weight: normal;"&gt;&lt;span style="font-size:78%;"&gt;       &lt;/span&gt;&lt;/span&gt;UnreachableException: I usually use this one to silence the compiler's reachability analyzer or to indicate to readers that a case is impossible.&lt;br /&gt;  &lt;pre&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Indicates a path expected to be unreachable has been executed.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;UnreachableException&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvalidStateException&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;Optional&lt;/span&gt; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; message &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                       &lt;span style="color: blue;"&gt;Optional&lt;/span&gt; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; innerException &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Exception&lt;/span&gt; = &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.New(&lt;span style="color: blue;"&gt;If&lt;/span&gt;(message, &lt;span style="color: rgb(163, 21, 21);"&gt;"Reached a state which was expected to not be reachable."&lt;/span&gt;), innerException)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;/pre&gt;&lt;br /&gt;  &lt;p class="MsoNoSpacing" style="margin-left: 36pt;"&gt;2.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-weight: normal;"&gt;&lt;span style="font-size:78%;"&gt;       &lt;/span&gt;&lt;/span&gt;ImpossibleValueException: I often throw this one in the default cases of switch statements over enums. I even defined an extension method for constructing it from any value.&lt;br /&gt;  &lt;pre&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Indicates an internal value expected to be impossible has been encountered.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ImpossibleValueException&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; T)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvalidStateException&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; Value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                       &lt;span style="color: blue;"&gt;Optional&lt;/span&gt; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; message &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                       &lt;span style="color: blue;"&gt;Optional&lt;/span&gt; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; innerException &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Exception&lt;/span&gt; = &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.new(&lt;span style="color: blue;"&gt;If&lt;/span&gt;(message, &lt;span style="color: rgb(163, 21, 21);"&gt;"The {0} value ""{1}"" was not expected."&lt;/span&gt;.Frmt(&lt;span style="color: blue;"&gt;GetType&lt;/span&gt;(&lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;).Name, &lt;span style="color: blue;"&gt;String&lt;/span&gt;.Concat(value))),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                       innerException)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.Value = value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;/pre&gt;&lt;br /&gt;  &lt;p class="MsoNoSpacing" style="margin-left: 36pt;"&gt;3.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-weight: normal;"&gt;&lt;span style="font-size:78%;"&gt;       &lt;/span&gt;&lt;/span&gt;InfiniteLoopException: I defined this one when making a single linked list iterator with cycle detection.&lt;br /&gt;  &lt;pre&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Indicates the program entered an infinite loop but the problem was caught and the loop aborted.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InfiniteLoopException&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvalidStateException&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;Optional&lt;/span&gt; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; message &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                       &lt;span style="color: blue;"&gt;Optional&lt;/span&gt; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; innerException &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Exception&lt;/span&gt; = &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.New(&lt;span style="color: blue;"&gt;If&lt;/span&gt;(message, &lt;span style="color: rgb(163, 21, 21);"&gt;"Detected and aborted an infinite loop."&lt;/span&gt;), innerException)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;/pre&gt;&lt;br /&gt;  &lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;   &lt;br /&gt;  The invalid state exception is not well covered by any of the default exception types, which is why I defined it. Once defined, I found myself using it in all kinds of (appropriate!) places. The moral: don't be afraid to define generic exceptions when you find yourself shoehorning a weird exception into the existing types. (Just don't go crazy.)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-5822005987912450523?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/5822005987912450523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/09/exceptions-to-die-by.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/5822005987912450523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/5822005987912450523'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/09/exceptions-to-die-by.html' title='Exceptions to Die By - The InvalidStateException'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-245597245568431094</id><published>2009-09-15T15:04:00.001-03:00</published><updated>2009-09-15T15:10:37.521-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Concurrency #4: Using the Call Queue</title><content type='html'>  &lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;   &lt;br /&gt;  Now that we have implemented a lock free queue, futures, and a call queue, we will start using them to perform concurrent programming. For example, consider a bank account class synchronized using locks:&lt;br /&gt;  &lt;pre&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: blue;"&gt;&lt;span style="font-size:85%;"&gt;Public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;BankAccount&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; balance &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;UInteger&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; lock &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; Deposit(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;UInteger&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;UInteger&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;SyncLock&lt;/span&gt; lock&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            balance += value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Return&lt;/span&gt; balance&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;SyncLock&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; TryWithdraw(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;UInteger&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;UInteger&lt;/span&gt;?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;SyncLock&lt;/span&gt; lock&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;If&lt;/span&gt; balance &lt; style="color: blue;"&gt;Then&lt;/span&gt; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            balance -= value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Return&lt;/span&gt; balance&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;SyncLock&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: blue;"&gt;&lt;span style="font-size:85%;"&gt;End&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;/pre&gt;&lt;br /&gt;  Rewriting the class to use queues and futures is dead simple, because the locking is at the method level. Just replace SyncLock blocks with QueueFunc blocks.&lt;br /&gt;  &lt;pre&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: blue;"&gt;&lt;span style="font-size:85%;"&gt;Public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;BankAccount&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; balance &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;UInteger&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; queue &lt;span style="color: blue;"&gt;As&lt;/span&gt; ICallQueue = &lt;span style="color: blue;"&gt;New&lt;/span&gt; ThreadPooledCallQueue()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; FutureDeposit(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;UInteger&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; IFuture(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;UInteger&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;queue&lt;/span&gt;.QueueFunc(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Function&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                balance += value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Return&lt;/span&gt; balance&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; FutureTryWithdraw(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;UInteger&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; IFuture(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;UInteger&lt;/span&gt;?)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;queue&lt;/span&gt;.QueueFunc(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Function&lt;/span&gt;() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;UInteger&lt;/span&gt;?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;If&lt;/span&gt; balance &lt; style="color: blue;"&gt;Then&lt;/span&gt;  &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                balance -= value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Return&lt;/span&gt; balance&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: blue;"&gt;&lt;span style="font-size:85%;"&gt;End&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;/pre&gt;&lt;br /&gt;  &lt;b&gt;Message Passing&lt;/b&gt;&lt;br /&gt;   &lt;br /&gt;  Look closely at the bank account example. Calling FutureTryWithdraw is like sending a message to the bank account object (saying "please try to withdraw X dollars"), and the future returned by the method is like a reply saying either "Ok, you now have X dollars!" or "Not enough funds!". We've implemented a form of &lt;b&gt;message passing&lt;/b&gt;, which is what highly concurrent languages like Erlang are based on.&lt;br /&gt;   &lt;br /&gt;  Message passing is not the holy grail of concurrency, but it is an extremely powerful abstraction. For example, it would be much easier to message-pass to a remote machine than do some type of lock sharing. Message passing also makes it &lt;b&gt;impossible &lt;/b&gt;to cause a deadlock (the closest analogue is creating a never-ending message cycle; much easier to debug). Most importantly, it is easier to reason about messages than locks. Proving a lock is used correctly requires looking at the entire program. Proving a message is used correctly only requires looking at part of the program (usually one or two functions).&lt;br /&gt;   &lt;br /&gt;  Messages are not superior to locks in every way, of course. Different methods work better in different situations. For example, there is no message-passing analogue for holding two locks at the same time. In addition, it is natural to lock only part a method but it is not always clear what that would mean in terms of passing messages.&lt;br /&gt;   &lt;br /&gt;  &lt;b&gt;Those Darn Philosophers&lt;/b&gt;&lt;br /&gt;   &lt;br /&gt;  I'm going to finish with an implementation of the dining philosophers done with message passing. Put it in a command line project (alongside the other classes introduced in this series). Notice how each class is simple on its own. In fact, the most complex parts are related to writing readable information to the console! In the next post in this series, I will supply implementations of futures for various asynchronous tasks.&lt;br /&gt;  &lt;pre&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: blue;"&gt;&lt;span style="font-size:85%;"&gt;Public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color: blue;"&gt;Module&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Main&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; Main()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Const&lt;/span&gt; NumPhilosphers &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt; = 5&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: green;"&gt;'Setup table&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; chopSticks(0 &lt;span style="color: blue;"&gt;To&lt;/span&gt; NumPhilosphers - 1) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Chopstick&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; philosophers(0 &lt;span style="color: blue;"&gt;To&lt;/span&gt; NumPhilosphers - 1) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;DiningPhilosopher&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;For&lt;/span&gt; i = 0 &lt;span style="color: blue;"&gt;To&lt;/span&gt; NumPhilosphers - 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            chopSticks(i) = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Chopstick&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Next&lt;/span&gt; i&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;For&lt;/span&gt; i = 0 &lt;span style="color: blue;"&gt;To&lt;/span&gt; NumPhilosphers - 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            philosophers(i) = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;DiningPhilosopher&lt;/span&gt;(&lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Random&lt;/span&gt;(&lt;span style="color: rgb(43, 145, 175);"&gt;Environment&lt;/span&gt;.TickCount + i), chopSticks(i), chopSticks((i + 1) &lt;span style="color: blue;"&gt;Mod&lt;/span&gt; NumPhilosphers))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Next&lt;/span&gt; i&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: green;"&gt;'Give a bit of stabilizing time for measurements&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Thread&lt;/span&gt;.Sleep(5000)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: green;"&gt;'Print status updates&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; n = 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Do&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            n += 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            System.&lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(163, 21, 21);"&gt;"Update #"&lt;/span&gt; + n.ToString())&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;For&lt;/span&gt; i = 0 &lt;span style="color: blue;"&gt;To&lt;/span&gt; NumPhilosphers - 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                System.&lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(163, 21, 21);"&gt;"Philosopher #"&lt;/span&gt; + i.ToString() + &lt;span style="color: rgb(163, 21, 21);"&gt;" is "&lt;/span&gt; + philosophers(i).Status + &lt;span style="color: rgb(163, 21, 21);"&gt;"."&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Next&lt;/span&gt; i&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Thread&lt;/span&gt;.Sleep(1000)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Loop&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: blue;"&gt;&lt;span style="font-size:85%;"&gt;End&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color: blue;"&gt;Module&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;'''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Represents a shared resource.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: blue;"&gt;&lt;span style="font-size:85%;"&gt;Public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Chopstick&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; queue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ICallQueue&lt;/span&gt; = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ThreadPooledCallQueue&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; inUse &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; QueueTryPickUp() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;HeldChopStick&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;queue&lt;/span&gt;.QueueFunc(&lt;span style="color: blue;"&gt;Function&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                   &lt;span style="color: blue;"&gt;If&lt;/span&gt; inUse &lt;span style="color: blue;"&gt;Then&lt;/span&gt;  &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                   inUse = &lt;span style="color: blue;"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                   &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;HeldChopStick&lt;/span&gt;(&lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; QueuePutDown)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                               &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; QueuePutDown() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;queue&lt;/span&gt;.QueueAction(&lt;span style="color: blue;"&gt;Sub&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                     inUse = &lt;span style="color: blue;"&gt;False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                 &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: blue;"&gt;&lt;span style="font-size:85%;"&gt;End&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;'''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Represents an acquired resource.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: blue;"&gt;&lt;span style="font-size:85%;"&gt;Public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;HeldChopStick&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; wasDropped &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; drop &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; drop &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.drop = drop&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; PutDown() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;If&lt;/span&gt; wasDropped &lt;span style="color: blue;"&gt;Then&lt;/span&gt; &lt;span style="color: blue;"&gt;Throw&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvalidOperationException&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        wasDropped = &lt;span style="color: blue;"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Return&lt;/span&gt; drop()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: blue;"&gt;&lt;span style="font-size:85%;"&gt;End&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;'''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Represents a philosopher trying to share chopsticks for eating.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: blue;"&gt;&lt;span style="font-size:85%;"&gt;Public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;DiningPhilosopher&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; leftChopStick &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Chopstick&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; rightChopStick &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Chopstick&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; feedings &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; lastTime &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Date&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; weightedRate &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Double&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; rng &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Random&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; leftChopStick &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Chopstick&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; rightChopStick &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Chopstick&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.lastTime = Now&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.leftChopStick = leftChopStick&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.rightChopStick = rightChopStick&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Call&lt;/span&gt; TryGrabChopsticks(rng)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: green;"&gt;'This method isn't thread-safe, but the errors will be marginal [race condition on increments and resets of 'feeding']&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; Status &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'Measure&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; t = Now&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; dt = t - lastTime&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; rate = feedings / dt.TotalSeconds&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'Estimate&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;If&lt;/span&gt; weightedRate = 0 &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                weightedRate = rate&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Else&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: green;"&gt;'Exponential approach w.r.t. time&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; lambda = 0.9 ^ dt.TotalSeconds&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                weightedRate *= lambda&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                weightedRate += rate * (1 - lambda)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;End If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'Categorize&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; category = &lt;span style="color: rgb(163, 21, 21);"&gt;""&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Select&lt;/span&gt; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; weightedRate&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Case&lt;/span&gt; 0 : category = &lt;span style="color: rgb(163, 21, 21);"&gt;"Empty"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Case&lt;/span&gt; 0 &lt;span style="color: blue;"&gt;To&lt;/span&gt; 1 : category = &lt;span style="color: rgb(163, 21, 21);"&gt;"Starving"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Case&lt;/span&gt; 1 &lt;span style="color: blue;"&gt;To&lt;/span&gt; 2 : category = &lt;span style="color: rgb(163, 21, 21);"&gt;"Hungry"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Case&lt;/span&gt; 2 &lt;span style="color: blue;"&gt;To&lt;/span&gt; 3 : category = &lt;span style="color: rgb(163, 21, 21);"&gt;"Satisfied"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Case Else&lt;/span&gt; : category = &lt;span style="color: rgb(163, 21, 21);"&gt;"Plump"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Select&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'Finish&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            lastTime = t&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            feedings = 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Return&lt;/span&gt; category + &lt;span style="color: rgb(163, 21, 21);"&gt;" (~"&lt;/span&gt; + weightedRate.ToString(&lt;span style="color: rgb(163, 21, 21);"&gt;"0.00"&lt;/span&gt;) + &lt;span style="color: rgb(163, 21, 21);"&gt;"/s)"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; TryGrabChopsticks(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; rng &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Random&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: green;"&gt;'Try to grab both chopsticks&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; futureLeft = leftChopStick.QueueTryPickUp()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; futureRight = rightChopStick.QueueTryPickUp()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: green;"&gt;'React once both chopsticks have been attempted&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        futureLeft.CallWhenValueReady(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;(left) futureRight.CallWhenValueReady(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;(right)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color: green;"&gt;'Call on a new thread because there are sleeps&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color: blue;"&gt;Call&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Thread&lt;/span&gt;(&lt;span style="color: blue;"&gt;Sub&lt;/span&gt;() TryHoldChopsticks(rng, left, right)).Start()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; TryHoldChopsticks(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; rng &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Random&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; left &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;HeldChopStick&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; right &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;HeldChopStick&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;If&lt;/span&gt; right &lt;span style="color: blue;"&gt;Is&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;OrElse&lt;/span&gt; left &lt;span style="color: blue;"&gt;Is&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'Oh no! Put down and wait a bit before trying again.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;If&lt;/span&gt; left &lt;span style="color: blue;"&gt;IsNot&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt; left.PutDown()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;If&lt;/span&gt; right &lt;span style="color: blue;"&gt;IsNot&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt; right.PutDown()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Thread&lt;/span&gt;.Sleep(10 + rng.Next(10))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Else&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'Yay! Food!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            feedings += 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Thread&lt;/span&gt;.Sleep(50 + rng.Next(50))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            left.PutDown()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            right.PutDown()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'Snooze&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Thread&lt;/span&gt;.Sleep(50 + rng.Next(50))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: green;"&gt;'Hungry! Repeat!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Call&lt;/span&gt; TryGrabChopsticks(rng)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: Consolas; color: blue;"&gt;&lt;span style="font-size:85%;"&gt;End&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-245597245568431094?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/245597245568431094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/09/introduction-now-that-we-have.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/245597245568431094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/245597245568431094'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/09/introduction-now-that-we-have.html' title='Concurrency #4: Using the Call Queue'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-581126577316615513</id><published>2009-08-17T17:57:00.004-03:00</published><updated>2009-08-17T18:19:48.146-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Concurrency #3: The Queue is the Mailbox</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;  &lt;br /&gt;   &lt;br /&gt;So far in this series, I have introduced futures and a lock-free queue. Now we are going to use those tools to create a call queue, which will just happen to return futures. This queue will allow us to do message-based synchronization, which will be covered in the next post.  &lt;br /&gt;   &lt;br /&gt;&lt;b&gt;Designing the Interface&lt;/b&gt;  &lt;br /&gt;   &lt;br /&gt;A call queue's interface is trivial. It accepts actions to run and, in this case, returns a future for when the action has completed.  &lt;br /&gt;&lt;pre&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Interface&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ICallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Function&lt;/span&gt; QueueAction(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; action &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Action&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Interface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt;We also want to be able to work with functions, so we will add an extension method that accepts functions and returns a future for the value computed when the queued function finally runs.  &lt;br /&gt;&lt;pre&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Module&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ExtensionsForICallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;&lt;span style="color: rgb(43, 145, 175);"&gt;Extension&lt;/span&gt;()&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; QueueFunc(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; R)(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; queue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ICallQueue&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; func &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; f &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            queue.QueueAction(&lt;span style="color: blue;"&gt;Sub&lt;/span&gt;() f.SetValue(func()))&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Return&lt;/span&gt; f&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Module&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt;Notice that the interface does not specify how the actions run. The queue might run them on a separate thread, on the thread pool, or in any other context it wants. The only requirements are that the queued calls must eventually run and they must run in order.  &lt;br /&gt;   &lt;br /&gt;&lt;b&gt;Implementing the Call Queue&lt;/b&gt;  &lt;br /&gt;   &lt;br /&gt;The call queue is going to be lock free, making things fast and (more importantly) interesting. The call queue implementation will handle guaranteeing the eventual execution of queued calls, since the lock-free queue handles the in-order stuff. We will need to create a consumer when the queue becomes non-empty, destroy the consumer when the queue becomes empty, and do all of this in parallel.  &lt;br /&gt;   &lt;br /&gt;To simplify reasoning about the very large number of possible thread interleavings, I am only going to focus on the exit point of methods. At every method exit point the queue will guarantee "empty or moving". To be more explicit, at every point the queue guarantees ONE of the following:  &lt;br /&gt;1)&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-weight: normal;"&gt;&lt;span style="font-size:78%;"&gt;      &lt;/span&gt;&lt;/span&gt;Queued calls are being executed  &lt;br /&gt;2)&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-weight: normal;"&gt;&lt;span style="font-size:78%;"&gt;      &lt;/span&gt;&lt;/span&gt;There is another thread executing inside the queue (which will affect shared state before it finishes)  &lt;br /&gt;3)&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-weight: normal;"&gt;&lt;span style="font-size:78%;"&gt;      &lt;/span&gt;&lt;/span&gt;The queue is empty  &lt;br /&gt;Given "empty or moving", it is impossible for a method to leave the queue idle in a non-empty state (which would result in calls potentially never being executed).  &lt;br /&gt;   &lt;br /&gt;Alright, let's implement a queue satisfying the above property! All the difficult logic will be placed into private methods for acquiring and releasing consumer responsibilities, and the queue will call them appropriately before exiting methods. Let's start with the simple stuff so we see the big picture. We need a lock-free queue to store queued actions, a method to enqueue actions, and an overridable method to consume them. The consume method is overridable so child classes can override it and do things like call the base method on a new thread, giving a threaded call queue.  &lt;br /&gt;&lt;pre&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;MustInherit&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;AbstractCallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ICallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; queue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;SingleConsumerLockFreeQueue&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Private&lt;/span&gt; running &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt; &lt;span style="color: green;"&gt;'stores consumer state and is used as a semaphore&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; action &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Action&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; future &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; action &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Action&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.action = action&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;   &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; QueueAction(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; action &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Action&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt; &lt;span style="color: blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ICallQueue&lt;/span&gt;.QueueAction&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; item = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;(action)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;queue&lt;/span&gt;.BeginEnqueue(item)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;If&lt;/span&gt; TryAcquireConsumer() &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Call&lt;/span&gt; Consume()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;End If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Return&lt;/span&gt; item.future&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;   &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; Consume()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Do&lt;/span&gt; &lt;span style="color: blue;"&gt;Until&lt;/span&gt; TryReleaseConsumer()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; item = &lt;span style="color: rgb(43, 145, 175);"&gt;queue&lt;/span&gt;.Dequeue()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Call&lt;/span&gt; item.action()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Call&lt;/span&gt; item.future.SetReady()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Loop&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt;Notice that the last shared-state-actions performed by QueueAction and Consume are TryAcquireConsumer and TryReleaseConsumer respectively. Therefore if those two methods meet "empty or moving", the queue will work.  &lt;br /&gt;   &lt;br /&gt;The TryAcquireConsumer method will be simple and optimistic, because many producers can call it at the same time. It will just optimistically fail if the queue is empty, and otherwise try to atomically acquire the consumer responsibilities. Now to prove all possible exits meet "empty or moving". The optimistic failure is safe, because if another producer exists to enqueue an item in parallel, then there is some other thread executing inside the queue. The attempt to acquire the lock is safe because if it fails then there is a consumer executing inside the queue, and if it succeeds then we will create a consumer executing inside the queue. Therefore, when this method ends the queue will be empty or there will be some thread executing inside the queue, which proves "empty or moving".  &lt;br /&gt;&lt;pre&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; TryAcquireConsumer() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;queue&lt;/span&gt;.WasEmpty &lt;span style="color: blue;"&gt;Then&lt;/span&gt; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Return&lt;/span&gt; Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Interlocked&lt;/span&gt;.Exchange(running, 1) = 0&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt;Try TryReleaseConsumer method will be less simply. It will first check if the queue is not empty, in which case clearly we should still be consuming and it will fail. Then it will optimistically release the consumer responsibilities. But, between the empty check and releasing responsibilities, a producer may have enqueued an item. Therefore, we have to try to re-acquire consumer responsibilities. If that fails, then we know the queue is empty or another thread is now the consumer. Therefore, if we fail to re-acquire consumer, responsibilities we are done and can safely exit.  &lt;br /&gt;   &lt;br /&gt;We're not done yet. There is one last possibility: some other thread may have acquired consumer responsibilities, emptied the queue, and released those responsibilities just before we acquired them; leaving us with a potentially empty queue! Therefore, if we acquire consumer responsibilities then the first thing we need to do is try to release consumer responsibilities &lt;b&gt;all over again&lt;/b&gt;! Therefore we must keep trying until we fail to acquire (in which case we exit the queue) or find a non-empty queue (in which case we process some items then come back). But, as long as we don't give up, "empty or moving" will be satisfied. Therefore, even though the caller can potentially be live-locked, TryReleaseConsumer satisfies "empty or moving". (The live lock is not an issue because, in order for it to occur, progress must be occurring).  &lt;br /&gt;&lt;pre&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; TryReleaseConsumer() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Do&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Not&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;queue&lt;/span&gt;.WasEmpty &lt;span style="color: blue;"&gt;Then&lt;/span&gt; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Interlocked&lt;/span&gt;.Exchange(running, 0)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Not&lt;/span&gt; TryAcquireConsumer() &lt;span style="color: blue;"&gt;Then&lt;/span&gt; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Loop&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt;&lt;b&gt;A couple call queue types&lt;/b&gt;  &lt;br /&gt;   &lt;br /&gt;Hurray, we have an abstract lock-free call queue! Now let's go nuts and implement some concrete types we'll actually want to use. The obvious one is a ThreadedCallQueue, which runs queued calls on an independent thread:  &lt;br /&gt;&lt;pre&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Runs queued calls on an independent thread.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ThreadedCallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;AbstractCallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; Consume()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Call&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Thread&lt;/span&gt;(&lt;span style="color: blue;"&gt;Sub&lt;/span&gt;() &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.Consume()).Start()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt;However, we might have a very large number of call queues in a program, and the start-up and tear-down cost for threads is quite high. The .Net framework provides a ThreadPool class that accepts work items to execute on a limited number of threads. We should create a ThreadPooledCallQueue for running queued calls with the thread pool:  &lt;br /&gt;&lt;pre&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Runs queued calls on the thread pool.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ThreadPooledCallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;AbstractCallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; Consume()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Call&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ThreadPool&lt;/span&gt;.QueueUserWorkItem(&lt;span style="color: blue;"&gt;Sub&lt;/span&gt;() &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.Consume())&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;/pre&gt;  &lt;br /&gt;Lastly, we might require our calls to run on the UI thread (attempting to access form controls from another thread causes exceptions). It would be extremely convenient if we had a call queue which didn't require us to Invoke all over the place. Enter the InvokedCallQueue:  &lt;br /&gt;&lt;pre&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Runs queued calls on a control's thread.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvokedCallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;AbstractCallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; control &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Windows.Forms.&lt;span style="color: rgb(43, 145, 175);"&gt;Control&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; control &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Windows.Forms.&lt;span style="color: rgb(43, 145, 175);"&gt;Control&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.control = control&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; Consume()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            control.BeginInvoke(&lt;span style="color: blue;"&gt;Sub&lt;/span&gt;() &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.Consume())&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt;There are surely plenty of other interesting ways to run queued calls, but these three have met my needs so far.  &lt;br /&gt;   &lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;  &lt;br /&gt;   &lt;br /&gt;Now we have a bunch of lock-free call queues we can use to order calls from multiple threads. In the next post in this series I will cover how to use the queue for synchronization and compare it with a lock based approach. Fully commented code follows.  &lt;br /&gt;&lt;pre&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Describes a thread-safe call queue for non-blocking calls.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Interface&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ICallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Queues an action to be run and returns a future for the action's eventual completion.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Function&lt;/span&gt; QueueAction(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; action &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Action&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Interface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Module&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ExtensionsForICallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Queues a function to be run and returns a future for the function's eventual output.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;&lt;span style="color: rgb(43, 145, 175);"&gt;Extension&lt;/span&gt;()&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; QueueFunc(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; R)(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; queue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ICallQueue&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; func &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; f &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;queue&lt;/span&gt;.QueueAction(&lt;span style="color: blue;"&gt;Sub&lt;/span&gt;() f.SetValue(func()))&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Return&lt;/span&gt; f&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Module&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    ''' &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    ''' A queue for running actions in order.&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    ''' Debug.Prints unexpected exceptions from queued calls.&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    ''' &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    ''' &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    ''' Consumes items produced by multiple producers.&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    ''' Ensures that enqueued items are consumed by ensuring at all exit points that either:&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    ''' - the queue is empty&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    ''' - or exactly one consumer exists&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    ''' - or another exit point will be hit [by another thread]&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    ''' &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;MustInherit&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;AbstractCallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ICallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; queue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;SingleConsumerLockFreeQueue&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Private&lt;/span&gt; running &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt; &lt;span style="color: green;"&gt;'stores consumer state and is used as a semaphore&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; action &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Action&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; future &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; action &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Action&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.action = action&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        ''' Queues an action to be run and returns a future for the action's eventual completion.&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        ''' Starts running calls from the if they were not already being run.&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        ''' Enqueues a sequence of items to be consumed by the consumer.&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        ''' The items are guaranteed to end up adjacent in the queue.&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; QueueAction(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; action &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Action&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt; &lt;span style="color: blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ICallQueue&lt;/span&gt;.QueueAction&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; item = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;(action)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;queue&lt;/span&gt;.BeginEnqueue(item)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'Start the consumer if it is not already running&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;If&lt;/span&gt; TryAcquireConsumer() &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Call&lt;/span&gt; Consume()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;End If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Return&lt;/span&gt; item.future&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Returns true if consumer responsibilities were acquired by this thread.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; TryAcquireConsumer() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'Don't bother acquiring if there are no items to consume&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'This unsafe check is alright because enqueuers call this method after enqueuing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'Even if an item is queued between the check and returning false, the enqueuer will call this method again&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'So we never end up with a non-empty idle queue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;queue&lt;/span&gt;.WasEmpty &lt;span style="color: blue;"&gt;Then&lt;/span&gt; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'Try to acquire consumer responsibilities&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Return&lt;/span&gt; Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Interlocked&lt;/span&gt;.Exchange(running, 1) = 0&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'Note that between the empty check and acquiring the consumer, all queued actions may have been processed.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: green;"&gt;'Therefore the queue may be empty at this point, but that's alright. Just a bit of extra work, nothing unsafe.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Returns true if consumer responsibilities were released by this thread.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; TryReleaseConsumer() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Do&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: green;"&gt;'Don't release while there's still things to consume&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Not&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;queue&lt;/span&gt;.WasEmpty &lt;span style="color: blue;"&gt;Then&lt;/span&gt; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: green;"&gt;'Release consumer responsibilities&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Interlocked&lt;/span&gt;.Exchange(running, 0)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: green;"&gt;'It is possible that a new item was queued between the empty check and actually releasing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: green;"&gt;'Therefore it is necessary to check if we can re-acquire in order to guarantee we don't leave a non-empty queue idle&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Not&lt;/span&gt; TryAcquireConsumer() &lt;span style="color: blue;"&gt;Then&lt;/span&gt; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: green;"&gt;'Even though we've now acquired consumer, we may have ended up with nothing to process!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: green;"&gt;'So let's repeat this whole check for empty/release dance!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: green;"&gt;'A caller could become live-locked here if other threads keep emptying and filling the queue.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: green;"&gt;'But only consumer threads call here, and the live-lock requires that progress is being made.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: green;"&gt;'So it's alright. We still make progress and we still don't end up in an invalid state.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Loop&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        ''' Runs queued calls until there are none left.&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        ''' Child classes can override and call base implementation using desired method (eg. on a new thread).&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; Consume()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Do&lt;/span&gt; &lt;span style="color: blue;"&gt;Until&lt;/span&gt; TryReleaseConsumer()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; item = &lt;span style="color: rgb(43, 145, 175);"&gt;queue&lt;/span&gt;.Dequeue()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Call&lt;/span&gt; item.action()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color: blue;"&gt;Call&lt;/span&gt; item.future.SetReady()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Loop&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Runs queued calls on an independent thread.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ThreadedCallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;AbstractCallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; Consume()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Call&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Thread&lt;/span&gt;(&lt;span style="color: blue;"&gt;Sub&lt;/span&gt;() &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.Consume()).Start()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Runs queued calls on the thread pool.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ThreadPooledCallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;AbstractCallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; Consume()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Call&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ThreadPool&lt;/span&gt;.QueueUserWorkItem(&lt;span style="color: blue;"&gt;Sub&lt;/span&gt;() &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.Consume())&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: green;"&gt;&lt;span style="font-size:85%;"&gt;Runs queued calls on a control's thread.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: gray;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvokedCallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;AbstractCallQueue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; control &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Windows.Forms.&lt;span style="color: rgb(43, 145, 175);"&gt;Control&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; control &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Windows.Forms.&lt;span style="color: rgb(43, 145, 175);"&gt;Control&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.control = control&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; Consume()&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            control.BeginInvoke(&lt;span style="color: blue;"&gt;Sub&lt;/span&gt;() &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.Consume())&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-581126577316615513?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/581126577316615513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/08/concurrency-3-queue-is-mailbox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/581126577316615513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/581126577316615513'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/08/concurrency-3-queue-is-mailbox.html' title='Concurrency #3: The Queue is the Mailbox'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-7688171353039569897</id><published>2009-08-04T13:54:00.000-03:00</published><updated>2009-08-04T13:58:16.228-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB10'/><category scheme='http://www.blogger.com/atom/ns#' term='VB'/><category scheme='http://www.blogger.com/atom/ns#' term='Iterator'/><category scheme='http://www.blogger.com/atom/ns#' term='yield'/><title type='text'>Emulating Yield-like Iterators in VB10</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;One of the defining characteristics of VB10 and C#4 is feature convergence. VB and C# now share optional arguments, dynamic types, multiline lambdas, and auto-properties. However, there are still differences between the two languages. One of the glaring differences is the lack of yield-style Iterators in VB. In this post, I am going to address that difference by constructing a class that uses lambda expressions to achieve functionality similar to yield.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Explicit Iterators vs Yield Iterators&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Explicitly implementing an iterator is a huge pain, because of the sheer amount of code required. You have to write a whole class, implement two interfaces (including their non-generic legacy versions), and manually track state. Put it all together and you get massive line waste.&lt;br /&gt;&lt;br /&gt;Just to hammer this in, here is a typical iterator implementation to enumerate a contiguous subset of an array:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:blue;"  &gt;&lt;span style="font-size:85%;"&gt;Public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;SubArrayIterator&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; T)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerator&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; array &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; offset &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; length &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; index &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; cur &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; array &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;(), &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; offset &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; length &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.array = array&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.offset = offset&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.length = length&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetEnumerator() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerator&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;) &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;).GetEnumerator&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;SubArrayIterator&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)(array, offset, length)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Current &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerator&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;).Current&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; cur&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; MoveNext() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; IEnumerator.MoveNext&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;If&lt;/span&gt; index &gt;= length &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        cur = array(index)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        index += 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Reset() &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; IEnumerator.Reset&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        index = 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Dispose() &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IDisposable&lt;/span&gt;.Dispose&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:green;"&gt;'no unmanaged state&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetEnumeratorObj() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerator&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; IEnumerable.GetEnumerator&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Return&lt;/span&gt; GetEnumerator()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; CurrentObj &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Object&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; IEnumerator.Current&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; cur&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:blue;"  &gt;&lt;span style="font-size:85%;"&gt;End&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Augh! Fifty lines for something I can describe in less than ten words! Now compare that to this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerable&lt;/span&gt;&lt;t&gt; IterateSubArray&amp;lt;T&amp;gt;(T[] array, &lt;span style="color:blue;"&gt;int&lt;/span&gt; offset, &lt;span style="color:blue;"&gt;int&lt;/span&gt; length) {&lt;/t&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;for&lt;/span&gt; (&lt;span style="color:blue;"&gt;int&lt;/span&gt; i = 0; i &lt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;yield&lt;/span&gt; &lt;span style="color:blue;"&gt;return&lt;/span&gt; array[i + offset];&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Wow! We jumped from fifty lines to four! The compiler will explicitly implement a large class (it translates the function into a state machine), but all we see is four lines. There are downsides (eg. Reset is not supported, but nobody uses Reset anyways), but they are mostly inconsequential compared to the code savings. The main problem is the lazy evaluation of the iterator causes argument exceptions to be thrown when the iterator is used instead of when it is constructed.&lt;br /&gt;&lt;br /&gt;I should probably point out that, using linq, the example enumeration can be just a single line. Remember that it is only for demonstration purposes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Controller&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The basic idea I have is to use a generator function to implement the enumeration. The function will take a controller, in order to signal special commands like "end of enumeration".&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:blue;"  &gt;&lt;span style="font-size:85%;"&gt;Public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumeratorController&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; T)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Break() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:blue;"  &gt;&lt;span style="font-size:85%;"&gt;End&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You can add more control methods as you desire them. Other useful possible control methods are "Multiple", which would return a sequence of items to enumerate, and "Repeat", which would return no item to enumerate and run the generator again. Note that the expected usage style of the controller methods is in a return statement (like "return controller.Break()"). This avoids confusing cases like calling break then returning an element to enumerate (Which would take precedence?).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Enumerator&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now that the controller is defined, we can write a class which implements IEnumerator&lt;t&gt; using a generator function. It's relatively straightforward: you just track the generator's last returned item and a flag for whether or not controller.break has been called yet. We have line waste, but we only have to include this code once instead of once per iterator.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:blue;"  &gt;&lt;span style="font-size:85%;"&gt;Public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color:blue;"&gt;NotInheritable&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Enumerator&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; T)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerator&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumeratorController&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; generator &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumeratorController&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;), &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; cur &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; break &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; generator &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumeratorController&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;), &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.generator = generator&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; MoveNext() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerator&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;).MoveNext&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.break &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;False&lt;/span&gt; &lt;span style="color:green;"&gt;'have previously called controller.break&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.cur = generator(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.break &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;False&lt;/span&gt; &lt;span style="color:green;"&gt;'just called controller.break&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; ControllerBreak() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumeratorController&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;).Break&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.break = &lt;span style="color:blue;"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Current &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerator&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;).Current&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.cur&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; CurrentObj &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Object&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerator&lt;/span&gt;.Current&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.cur&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Reset() &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerator&lt;/span&gt;.Reset&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;NotSupportedException&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Dispose() &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IDisposable&lt;/span&gt;.Dispose&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:green;"&gt;'no unmanaged state&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:blue;"  &gt;&lt;span style="font-size:85%;"&gt;End&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;The Generator&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;With our Enumerator and Controller in hand, we can write a function to enumerate a contiguous subset of an array. We will use a lambda expression for the generator, and a hoisted local variable to keep state:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; EnumerateSubArray(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; T)(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; items() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; offset &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; length &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerator&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; index = 0 &lt;span style="color:green;"&gt;'hoisted variable used for state&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Enumerator&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Function&lt;/span&gt;(controller)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;If&lt;/span&gt; index &gt;= length &lt;span style="color:blue;"&gt;Then&lt;/span&gt;  &lt;span style="color:blue;"&gt;Return&lt;/span&gt; controller.Break()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                index += 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;Return&lt;/span&gt; items(index - 1)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The result isn't be as compact as using C#'s yield, but is still a huge improvement over explicit implementation. It's essentially like implementing only the MoveNext method instead of an entire enumerator class. The main downside compared to yield is the loss of multiple entry points into the function (we always start at the beginning, not on the line after the last return). We do have one advantage over using yield: we can check arguments upon construction of the iterator (because everything before return New Enumerator(...) is executed immediately).&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Enumerable vs Enumerator&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;An IEnumerable&lt;t&gt; is an object that can be enumerated more than once. It returns a new enumerator for each enumeration, and is the type required by the useful 'for each' loop. In order to implement an IEnumerable&lt;t&gt; we just pull the same trick again: seeding a class with a generator function. Luckily, this time we don't need a controller because an IEnumerable&lt;t&gt; doesn't require state.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;NotInheritable&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Enumerable&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; T)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; generator &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerator&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; generator &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerator&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.generator = generator&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetEnumerator() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerator&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;) &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;).GetEnumerator&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; generator()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetEnumeratorObj() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerator&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerable&lt;/span&gt;.GetEnumerator&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; GetEnumerator()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;At last, we can properly iterate over that contiguous array subset by using our previous EnumerateSubArray function to generate enumerators:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; IterateSubArray(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; T)(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; items() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; offset &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; length &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Enumerable&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)(&lt;span style="color:blue;"&gt;Function&lt;/span&gt;() EnumerateSubArray(items, offset, length))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Even though VB doesn't have a yield keyword, we can still cut the number of lines required for an iterator by a factor a five. All we needed were a couple classes to turn generator functions into an enumerator. It's not as good as using yield, but we don't have yield.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-7688171353039569897?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/7688171353039569897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/08/emulating-yield-like-iterators-in-vb10.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/7688171353039569897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/7688171353039569897'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/08/emulating-yield-like-iterators-in-vb10.html' title='Emulating Yield-like Iterators in VB10'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-8071286390721896013</id><published>2009-07-13T02:25:00.004-03:00</published><updated>2009-07-13T02:52:42.987-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Concurrency #2: The Future is the Message</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A future is a thing that may not be available now, but will be available later. This simple abstraction simplifies many concurrent tasks by cleanly separating how they are performed and how their results are used.  All the caller cares about is that the result will eventually be available, and all the callee cares about is eventually making the result available.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Implementation&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We'll start by defining an interface for future values. Callers will need to be able to check if the future is ready yet, a way to be informed when the future does become ready, and a method to extract the future's value once it is ready. So let's start with an interface which does just that:&lt;br /&gt;&lt;pre&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color:blue;"&gt;Out&lt;/span&gt; R)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Event&lt;/span&gt; Readied()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; IsReady() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetValue() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt; That's good, but sometimes we don't want to include a value with the future (e.g. we just want to signal when a subroutine has finished), and some methods only care about the 'will eventually be ready' part of the future. Let's refactor the interface into two interfaces:&lt;br /&gt;&lt;pre&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Event&lt;/span&gt; Readied()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; IsReady() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color:blue;"&gt;Out&lt;/span&gt; R)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetValue() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt; Now IFuture(of A) and IFuture(of B) share their common functionality, which is a nice property to have. We will also need classes implementing the IFuture interfaces, so we actually have something to return from future functions. They aren't very hard to implement, so I'll just include what you get if you remove everything but the declarations. Notice that, although IFuture(of R) inherits from IFuture, Future(of R) doesn't inherit from Future. Do you see why?&lt;br /&gt;&lt;pre&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Event&lt;/span&gt; Readied() &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; IFuture.Readied&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; IsReady() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; IFuture.IsReady&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; TrySetReady() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; SetReady() &lt;span style="color:green;"&gt;'Throws an InvalidOperationException if the future was already ready.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; R)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Event&lt;/span&gt; Readied() &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; IFuture.Readied&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; IsReady() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; IFuture.IsReady&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetValue() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;).GetValue &lt;span style="color:green;"&gt;'Throws an InvalidOperationException if the value isn't ready yet.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; TrySetValue(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; val &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; SetValue(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; val &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;span style="color:green;"&gt; 'Throws an InvalidOperationException if the future was already ready.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt; Alright, so now we're all set to start using futures! Well, except these super simple interfaces would be a huge pain to use. We need to define some higher level operations to make things easier. We'll use extension methods to implement them as if they were part of the interface itself. The methods we will require are:&lt;br /&gt;-              CallWhenReady: Calls an action when a future is ready, and returns a future for when the action completes.&lt;br /&gt;-              EvalWhenReady&lt;br /&gt;&lt;r&gt;: Evaluates a function when a future is ready, and returns a future for the function's output.&lt;br /&gt;-              CallWhenValueReady&amp;lt;a&amp;gt;: Calls an action when a future is ready, passing the future's value as an argument, and returns a future for when the action completes.&lt;br /&gt;-              EvalWhenValueReady&amp;lt;a,r&amp;gt;: Evaluates a function when a future is ready, passing the future's value as an argument, and returns a future for the function's output.&lt;br /&gt;-              Futurize: Takes any value and returns an instantly-ready future for it.&lt;br /&gt;-              Defuturize: Takes a future of a future and returns a condensed version, which is just a normal future.&lt;br /&gt;-              Defuturize&amp;lt;r&amp;gt;: Takes a future of a future of a value and returns a condensed version, which is just a normal future for the final value.&lt;br /&gt;&lt;br /&gt;The simplest and operation is Futurize, and it can be implemented like this:&lt;br /&gt; &lt;pre&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &amp;lt;&lt;span style="color: rgb(43, 145, 175);"&gt;Extension&lt;/span&gt;()&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Futurize(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; R)(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; f = &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            f.SetValue(value)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; f&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt; The most complicated operation to implement is CallWhenReady. It's also the most useful operation, because the other operations can all be implemented easily using CallWhenReady. Here it is:&lt;br /&gt; &lt;pre&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;&lt;span style="color: rgb(43, 145, 175);"&gt;Extension&lt;/span&gt;()&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; CallWhenReady(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; future &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                      &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; action &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Action&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; lockVal &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; f &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; notify &lt;span style="color:blue;"&gt;As&lt;/span&gt; IFuture.ReadiedEventHandler&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            notify = &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                         &lt;span style="color:blue;"&gt;If&lt;/span&gt; Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Interlocked&lt;/span&gt;.Exchange(lockVal, 1) = 0 &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:green;"&gt;'only run once&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                             &lt;span style="color:blue;"&gt;RemoveHandler&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;future&lt;/span&gt;.Readied, notify&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                             &lt;span style="color:blue;"&gt;Call&lt;/span&gt; action()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                             f.SetReady()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                         &lt;span style="color:blue;"&gt;End If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                     &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;AddHandler&lt;/span&gt; future.Readied, notify&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; future.IsReady &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Call&lt;/span&gt; notify() &lt;span style="color:green;"&gt;'In case the future was already ready&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 176, 80);font-family:Consolas;" &gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; f&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt; Wow, that's a bit complicated! At least the concept is simple. First, we define the notification subroutine, which will run the target action and set CallWhenReady's returned future to ready. Then we make sure the notification subroutine is called once the future is ready. Note that there is a chance the future will become ready between registering for the event and manually checking, which is why the notify subroutine is wrapped in a one time lock.&lt;br /&gt;&lt;br /&gt;The rest of the higher level operations are short and sweet because they can be implemented using CallWhenReady. Try to implement them (or just cheat and look at the end of the post).&lt;br /&gt;&lt;br /&gt;Some readers might not be familiar with Visual Basic, so I will quickly cover the things used by this method.&lt;br /&gt;-&lt;span style=";font-family:&amp;quot;;" &gt;&lt;span style="font-size:78%;"&gt;          &lt;/span&gt;&lt;/span&gt;The first line applies the Extension attribute to the method. That tells the compiler the method can be used as if it was part of IFuture. It allows me to write someFuture.CallWhenReady(...) instead of CallWhenReady(someFuture, ...), and includes the method in intellisense. Extension methods are extremely useful, because they make it much easier to discover helper methods.&lt;br /&gt;-&lt;span style=";font-family:&amp;quot;;" &gt;&lt;span style="font-size:78%;"&gt;          &lt;/span&gt;&lt;/span&gt;The sub ... end sub block is an anonymous subroutine, also called a lambda expression or a closure. Lambda expressions let you inline simple helper functions, but their real power comes from their access to the surrounding variables. For example, CallWhenReady's anonymous notify subroutine uses the arguments passed to CallWhenReady. This is achieved behind the scenes by 'hoisting' those local variables into a private class and passing it to the anonymous method.&lt;br /&gt;-&lt;span style=";font-family:&amp;quot;;" &gt;&lt;span style="font-size:78%;"&gt;          &lt;/span&gt;&lt;/span&gt;RemoveHandler and AddHandler are used to add and remove the methods called when an Event is raised. In this case we want notify to be called when Readied is fired, then we remove notify to remove unnecessary references (which would prevent the garbage collector from collecting futures derived from any future you held on to).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example  #1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now we have all the pieces we need in order to use futures. Let's explore a simple example: replacing existing asynchronous methods with futures. We will replace the Net.Sockets.TcpClient BeginConnect/EndConnect methods with a single FutureConnect method. Here is an example of using BeginConnect/EndConnect:&lt;br /&gt;&lt;pre&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    'Connecting code:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:green;"&gt;'...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:green;"&gt;'... do whatever you're doing leading up to a connection&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:green;"&gt;'...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; client = &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;TcpClient&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Try&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:green;"&gt;'starts a new async task, which calls EndConnect:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            client.BeginConnect(hostname, port, &lt;span style="color:blue;"&gt;AddressOf&lt;/span&gt; EndConnect, client)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; e &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;SocketException&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:green;"&gt;'deal with failure to connect&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Try&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:green;"&gt;'...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; EndConnect(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; ar &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IAsyncResult&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; client = &lt;span style="color:blue;"&gt;CType&lt;/span&gt;(ar.AsyncState, &lt;span style="color: rgb(43, 145, 175);"&gt;TcpClient&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Try&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            client.EndConnect(ar)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; e &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;SocketException&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:green;"&gt;'deal with failure to connect&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Try&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:green;"&gt;'...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:green;"&gt;'do whatever you wanted to do with the client once it was connected&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color: rgb(100, 100, 185);"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(100, 100, 185);font-family:Consolas;" &gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt; I don't like the Begin/End style methods for a bunch of reasons. Do you see how the BeginConnect method mixes arguments about what you want and what to do with it? That you have to handle the IAsyncResult argument? That the ar.AsyncState member is type unsafe? How we have to call EndConnect for every call to BeginConnect? How this pattern has to repeated &lt;b&gt;every single time&lt;/b&gt; you use BeginConnect/EndConnect? All these little problems add up! I don't want to care about these details!&lt;br /&gt;&lt;br /&gt;Now we'll implement the same thing with futures. Here is a FutureConnect function:&lt;br /&gt; &lt;pre&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; FutureConnect(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; hostname &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                  &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; port &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;UShort&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;PossibleException&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;TcpClient&lt;/span&gt;, &lt;span style="color: rgb(43, 145, 175);"&gt;SocketException&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; f = &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;PossibleException&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;TcpClient&lt;/span&gt;, &lt;span style="color: rgb(43, 145, 175);"&gt;SocketException&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Try&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; client = &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;TcpClient&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            client.BeginConnect(hostname, port, &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;(ar)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                    &lt;span style="color:blue;"&gt;Try&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                        client.EndConnect(ar)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                        f.SetValue(client)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                    &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; e &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;SocketException&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                        f.SetValue(e)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Try&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;, &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; e &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;SocketException&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            f.SetValue(e)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Try&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Return&lt;/span&gt; f&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;   Essentially, we just wrapped the existing BeginConnect/EndConnect methods inside a future. The main differences are the use of futures and the fact that we create a new TcpClient instead of affecting an existing TcpClient.&lt;br /&gt;&lt;br /&gt;Let's use our fancy future connect method. Here is an example:&lt;br /&gt; &lt;pre&gt; &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:green;"&gt;'...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:green;"&gt;'... do whatever you're doing leading up to a connection&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:green;"&gt;'...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        FutureConnect(hostname, port).CallWhenValueReady(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;(possibleClient)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;If&lt;/span&gt; possibleClient.Exception &lt;span style="color:blue;"&gt;IsNot&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:green;"&gt;'deal with failure to connect&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:blue;"&gt;Return&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;End If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; client = possibleClient.Value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:green;"&gt;'...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:green;"&gt;'do whatever you wanted to do with the client once it was connected&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:green;"&gt;'...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        )&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:green;"&gt;'...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt; Do you see how the "what I want" and "what I want to do with it" parts are separated? How everything  is type safe? How there is no required EndFutureConnect call? We've managed to eliminate those little details. That is a good abstraction at work.&lt;br /&gt;&lt;br /&gt;There is a downside to using futures shown here, though. Did you notice that the return value was a PossibleException? That's just a structure which stores a value or an exception. It is impossible for exceptions to safely propagate out of a future the way you expect, so you must encode them into the future's value. The upside is that, because the future's value is type safe, you can't accidentally ignore the possible exception.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example #2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Suppose you want to do something after a subroutine finishes, but you want to run the subroutine on another thread. Or suppose it's a function running on the other thread and you need to wait for its return value. Futures make this problem trivial. You just write a method that returns a future, and runs the function or subroutine on another thread.&lt;br /&gt; &lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; FutureThreadedAction(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; action &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Action&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; f &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Call&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Thread&lt;/span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:blue;"&gt;Call&lt;/span&gt; action()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:blue;"&gt;Call&lt;/span&gt; f.SetReady()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            ).Start()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; f&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; FutureThreadedFunction(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; R)(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; func &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; f &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            FutureThreadedAction(&lt;span style="color:blue;"&gt;Sub&lt;/span&gt;() f.SetValue(func()))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; f&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt; That's it. Now you can call these methods to run functions on other threads, and use futures to work with the return values. I really like this example because, even though we haven't solved any big problems, we've solve one of those tiny annoyances we deal with every day as programmers. The futures are &lt;b&gt;making things easier&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We've really just scratched the surface here. In my next post I will be creating a concurrent call queue which uses futures. In the post after that I will put it all together to implement message passing.&lt;br /&gt;&lt;br /&gt;An implementation of futures is posted below. The whole thing is just 170 lines, including comments and whitespace. (My original implementation took upwards of 500 lines, so I'm oddly proud of the line count).&lt;br /&gt; &lt;pre&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:blue;"  &gt;&lt;span style="font-size:85%;"&gt;Imports&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; System.Runtime.CompilerServices&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;''''Provides type-safe methods for return values that will be ready in the future, and for passing future arguments into normal functions.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:blue;"  &gt;&lt;span style="font-size:85%;"&gt;Namespace&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; Futures&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;Represents a thread-safe read-only class that fires an event when it becomes ready.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;Raised when the future becomes ready.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Event&lt;/span&gt; Readied()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;Returns true if the future is ready.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; IsReady() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;Represents a thread-safe read-only class that fires an event when its value becomes ready.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color:blue;"&gt;Out&lt;/span&gt; R)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Returns the future's value.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Throws an InvalidOperationException if the value isn't ready yet.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetValue() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;A thread-safe class that fires an event when it becomes ready.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Private&lt;/span&gt; lockVal &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Event&lt;/span&gt; Readied() &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; IFuture.Readied&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;Returns true if the future is ready.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; IsReady() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; IFuture.IsReady&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;Return&lt;/span&gt; lockVal = 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Makes the future ready.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Throws an InvalidOperationException if the future was already ready.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; SetReady()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Not&lt;/span&gt; TrySetReady() &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"Future readied more than once."&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;End If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Makes the future ready.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Returns false if the future was already ready.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; TrySetReady() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Interlocked&lt;/span&gt;.Exchange(lockVal, 1) &lt;&gt; 0 &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;RaiseEvent&lt;/span&gt; Readied()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;A thread-safe class that fires an event when its value becomes ready.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; R)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Private&lt;/span&gt; val &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Private&lt;/span&gt; lockVal &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; lockReady &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;OneTimeLock&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Event&lt;/span&gt; Readied() &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; IFuture.Readied&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;Returns true if the future is ready.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; IsReady() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; IFuture.IsReady&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;Return&lt;/span&gt; lockVal = 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''Returns the future's value.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''Throws an InvalidOperationException if the value isn't ready yet.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetValue() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;).GetValue&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Not&lt;/span&gt; IsReady &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"Attempted to get a future value before it was ready."&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; val&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Sets the future's value and makes the future ready.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Throws a InvalidOperationException if the future was already ready.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; SetValue(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; val &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Not&lt;/span&gt; TrySetValue(val) &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"Future readied more than once."&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;End If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Sets the future's value and makes the future ready.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Fails if the future was already ready.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; TrySetValue(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; val &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Interlocked&lt;/span&gt;.Exchange(lockVal, 1) &lt;&gt; 0 &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.val = val&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;RaiseEvent&lt;/span&gt; Readied()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Module&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ExtensionsForIFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;Runs an action once the future is ready, and returns a future for the action's completion.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;&lt;span style="color: rgb(43, 145, 175);"&gt;Extension&lt;/span&gt;()&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; CallWhenReady(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; future &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                      &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; action &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Action&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; lockVal &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; f &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; notify &lt;span style="color:blue;"&gt;As&lt;/span&gt; IFuture.ReadiedEventHandler&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            notify = &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                         &lt;span style="color:blue;"&gt;If&lt;/span&gt; lock.TryAcquire &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:green;"&gt;'only run once&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                             &lt;span style="color:blue;"&gt;RemoveHandler&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;future&lt;/span&gt;.Readied, notify&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                             &lt;span style="color:blue;"&gt;Call&lt;/span&gt; action()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                             f.SetReady()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                         &lt;span style="color:blue;"&gt;End If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                     &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;AddHandler&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;future&lt;/span&gt;.Readied, notify&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;future&lt;/span&gt;.IsReady &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Call&lt;/span&gt; notify() 'in case the future was already ready&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; f&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;Passes the future's value to an action once ready, and returns a future for the action's completion.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;&lt;span style="color: rgb(43, 145, 175);"&gt;Extension&lt;/span&gt;()&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; CallWhenValueReady(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; A1)(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; future &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;A1&lt;/span&gt;),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                  &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; action &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Action&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;A1&lt;/span&gt;)) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;future&lt;/span&gt;.CallWhenReady(&lt;span style="color:blue;"&gt;Sub&lt;/span&gt;() action(&lt;span style="color: rgb(43, 145, 175);"&gt;future&lt;/span&gt;.GetValue))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;Runs a function once the future is ready, and returns a future for the function's return value.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;&lt;span style="color: rgb(43, 145, 175);"&gt;Extension&lt;/span&gt;()&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; EvalWhenReady(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; R)(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; future &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                            &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; func &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; f &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;future&lt;/span&gt;.CallWhenReady(&lt;span style="color:blue;"&gt;Sub&lt;/span&gt;() f.SetValue(func()))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; f&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;Passes the future's value to a function once ready, and returns a future for the function's return value.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;&lt;span style="color: rgb(43, 145, 175);"&gt;Extension&lt;/span&gt;()&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; EvalWhenValueReady(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; A1, R)(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; future &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;A1&lt;/span&gt;),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                                     &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; func &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;A1&lt;/span&gt;, &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;future&lt;/span&gt;.EvalWhenReady(&lt;span style="color:blue;"&gt;Function&lt;/span&gt;() func(&lt;span style="color: rgb(43, 145, 175);"&gt;future&lt;/span&gt;.GetValue))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;Wraps a normal value as an instantly ready future.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;&lt;span style="color: rgb(43, 145, 175);"&gt;Extension&lt;/span&gt;()&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Futurize(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; R)(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; f = &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            f.SetValue(value)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; f&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;Returns a future for the final value of a future of a future.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;&lt;span style="color: rgb(43, 145, 175);"&gt;Extension&lt;/span&gt;()&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Defuturize(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; R)(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; futureFutureVal &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;))) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; f = &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;R&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            futureFutureVal.CallWhenValueReady(&lt;span style="color:blue;"&gt;Sub&lt;/span&gt;(futureVal) futureVal.CallWhenValueReady(&lt;span style="color:blue;"&gt;Sub&lt;/span&gt;(value) f.SetValue(value)))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; f&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;Returns a future for the readyness of a future of a future.&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;&lt;span style="color: rgb(43, 145, 175);"&gt;Extension&lt;/span&gt;()&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Defuturize(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; futureFuture &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;)) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IFuture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; f = &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Future&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            futureFuture.CallWhenValueReady(&lt;span style="color:blue;"&gt;Sub&lt;/span&gt;(future) &lt;span style="color: rgb(43, 145, 175);"&gt;future&lt;/span&gt;.CallWhenReady(&lt;span style="color:blue;"&gt;Sub&lt;/span&gt;() f.SetReady()))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; f&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span color="blue"&gt;Module&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:blue;"  &gt;&lt;span style="font-size:85%;"&gt;End&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span color="blue"&gt;Namespace&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/r&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-8071286390721896013?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/8071286390721896013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/07/concurrency-2-future-is-message.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/8071286390721896013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/8071286390721896013'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/07/concurrency-2-future-is-message.html' title='Concurrency #2: The Future is the Message'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-6100736108578904611</id><published>2009-07-04T20:21:00.002-03:00</published><updated>2009-07-13T02:26:34.938-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Concurrency #1: A Multiple-Producer Single-Consumer Lock Free Queue</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The later parts of this series are going to require a call queue which accepts calls to run from multiple threads, then ensures they are run in the order they are received. But before we get to a call queue we're going to need a plain vanilla thread-safe queue. My first implementation used the obvious approach: place locks around the Enqueue and Dequeue methods. But when I used this queue, profiling revealed a full quarter of the program's time was spent acquiring and releasing locks! Half of that was attributable to the call queues. I do put a ton of calls through these queues, so I need them be as fast as possible.&lt;br /&gt;&lt;br /&gt;Enter lock free data structures, which I'd read a little bit about at the time. Instead of using locks, they use simple atomic operations provided by the hardware. This allows them to be much faster, but it also makes them &lt;b&gt;incredibly&lt;/b&gt; hard to write correctly. You need to figure out how to do it without locks, then you need to worry about reads and writes being reordered by modern superscalar processors, then you need to worry about the compiler moving things around, caching reads, removing writes, and other optimizations that work great for &lt;b&gt;single-threaded&lt;/b&gt; programs. I really don't want to understate exactly how hard you have to think about lock free stuff. Don't write lock-free stuff unless you're prepared to write an essay explaining why the code is correct (only to find some thread interleaving that takes the whole thing down).&lt;br /&gt;&lt;br /&gt;Most lock free queue examples out there use the humble CAS (compare-and-swap) atomic primitive. CAS atomically assigns a value to a variable only if the variable is equal to another value. Here is some pseudo code for CAS. Note that all my code samples are in VB10, which is in beta at the time of this writing.&lt;br /&gt;&lt;pre&gt;  &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; CompareAndSwap(&lt;span style="color:blue;"&gt;ByRef&lt;/span&gt; target &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                   &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; newValue &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                                   &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; comparisonValue &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;SyncLock&lt;/span&gt; GlobalLock&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; target &lt;&gt; comparisonValue &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            target = comparisonValue&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;SyncLock&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;  I wanted to write a unique queue, so I decided to try to avoid using CAS. I ended up using the XCHG (Exchange) atomic primitive. XCHG atomically gets-and-sets a variable, effectively exchanging a new value for the old value. Pseudo code:&lt;br /&gt;&lt;pre&gt;  &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Exchange(&lt;span style="color:blue;"&gt;ByRef&lt;/span&gt; target &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                             &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; newValue &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;SyncLock&lt;/span&gt; GlobalLock&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; oldValue = target&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            target = newValue&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; oldValue&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;SyncLock&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;  This is the only atomic primitive I needed for the queue.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Designing the Queue&lt;/b&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;Queues are typically stored in two ways: as an array or as a linked list. I don't want to even think about how hard it would be to resize an array without acquiring any locks, so the queue is stored using a linked list. There will be a head node, which the consumer will advance in order to dequeue elements, and a tail node which producers will use to enqueue items. The producers will never manipulate the head variable, and items will be published to the queue purely by linking them to the insertion point.&lt;br /&gt;&lt;pre&gt;  &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;SingleConsumerLockFreeQueue&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; T)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Private&lt;/span&gt; head &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt; = &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;(&lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Private&lt;/span&gt; insertionPoint &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt; = head&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Public&lt;/span&gt; [next] &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.value = value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        ...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;  Essentially the same starting definition you use for any linked list queue. The consumer part is also easy. There is no need for any locks or atomic operations because there is only one consumer, and the producers never manipulate the head variable. We can just implement it as if we were working with a single threaded queue:&lt;br /&gt;&lt;pre&gt;  &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        ...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; WasEmpty &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;Return&lt;/span&gt; head.next &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Peek() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; head.next &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"Empty Queue"&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; head.next.value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Dequeue() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; head.next &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"Empty Queue"&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            head = head.next&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; head.value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        ...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;  Note that Peek and Dequeue must only be called from the Consumer thread. You can call WasEmpty from a producer thread, but its return value won't be stable. It's only stable if the queue is non-empty and we called from the Consumer thread (which is why it's WasEmpty instead of IsEmpty). If you've seen CAS-based queues, you'll also notice I avoided some issues by making ".next != null" implicitely equivalent to "another item is queued".&lt;br /&gt;&lt;br /&gt;The producers are more complicated. They're going to have to share the insertion point variable by using the XCHG operation. Each producer will exchange a new node for the current insertion point, which will stop producers from interfering with each other:&lt;br /&gt;&lt;pre&gt;  &lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        ...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; BeginEnqueue(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; item &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; newNode = &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;(item)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; oldInsertionPoint = Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Interlocked&lt;/span&gt;.Exchange(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;.insertionPoint, newNode)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            oldInsertionPoint.next = newNode&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        ...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;  This queue is essentially identical to a normal queue, except for the XCHG magic in BeginEnqueue. Note that there's a reason I call it BeginEnqueue instead of Enqueue, which comes up later in this post.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Correctness&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;With the producer and consumer methods defined, we now have a complete queue. But is it correct? The consumer part probably is, but the producer part looks like it could get crazy with lots of threads in there! Let's start by proving the producers don't destructively interfere with each other.&lt;br /&gt;&lt;br /&gt;Notice that, for each call to BeginEnqueue, a brand new node is passed as the second argument to XCHG. Therefore, the second argument to XCHG will always be unique. Therefore, the value returned by XCHG will always be unique, because it essentially lags the second argument by one call. Therefore, each producer gets a unique oldInsertionPoint. Also notice that the producers never modify the .next pointer of its own constructed node: they leave that responsibility to the next producer to call XCHG. In fact, the only time a node's .next pointer is ever modified is "oldInsertionPoint.next = newNode". Therefore, there is no write-write race condition on oldInsertionPoint.next = newNode, because oldInsertionPoint is unique to each call and the .next pointer is modified nowhere else. Finally, notice that the .next pointer can only change in the future if it is currently null. This guarantees the property I mentioned earlier: ".next != null" == "another item is queued".&lt;br /&gt;&lt;br /&gt;A good mental image of the queue is a big disassembled and growing chain randomly linking itself together until it is a big assembled chain. In later posts I will talk about how I tested the queue in order to truly convince myself it was correct (It wasn't just stress testing.). For now, let's convince ourselves by looking at an example of what happens when two threads contend while enqueueing items.&lt;br /&gt;&lt;br /&gt;&lt;div id="xte9" style="text-align: left;"&gt;&lt;img style="width: 648px; height: 167.308px;" src="http://docs.google.com/File?id=d39r7rf_1fmbsdxdf_b" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;We start with an empty queue, with the insertion point equal to the head. Then two threads call BeginEnqueue. The threads race, but Thread1 calls XCHG first. Its gets the head as its old insertion point and sets the new insertion point to its constructed node. Now Thread2 pre-empts Thread1 and runs its call to XCHG, getting Thread1's constructed node as its old insertion point. Thread2 continues and finishes, linking Prev2.next to Node2, but leaving the queue still technically empty. Finally, Thread1 finishes and links Prev1.next to Node1, leaving the queue with two items. Even though the thread order was perturbed, the chain still came together correctly. This works for any number of threads. Try it.&lt;br /&gt;&lt;br /&gt;To finish this section off, notice that I can actually write a modified BeginEnqueue method to enqueue a sequence of items and guarantee they end up adjacent in the queue. Do you see how to do it?&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Performance&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now that I've convinced myself the queue is correct, I want to know how it performs compared to the old locking queue and to CAS-based lock free queues. Actually, comparing it to the old queue was a joke. I profiled my code after I inserted this queue, and it just destroyed the old queue. The queueing overhead was essentially gone. So, I'm going to jump straight to armchair comparing it against CAS queues.&lt;br /&gt;&lt;br /&gt;The obvious thing to notice is that all XCHG queue operations are guaranteed constant time. CAS queues, on the other hand, can spend arbitrarily long trying to enqueue their value (in practice this is extremely unlikely).  The XCHG operation is also simpler than CAS. Overall, I expect producer throughput to be non-negligibly faster than a CAS based queue. The ability to safely enqueue multiple adjacent items is also nice and could be used to significantly reduce the number of calls to the expensive atomic operations.&lt;br /&gt;&lt;br /&gt;The consumer side is essentially equivalent to a CAS queue, in that it could be modified to be multiple-consumer by using CAS. We don't need multiple consumers for a call queue, so I didn't bother making it safe for multiple consumers. The major consumer benefit compared to a CAS queue is that garbage collection is not required. Most lock free data structures require garbage collection, because anytime you explicitly free a node there is a risk that some slow thread still has a reference to it. Here the consumer can safely free nodes when their .next is consumed (because setting .next is the last thing a producer does), making a translation to a low level language like C trivial.&lt;br /&gt;&lt;br /&gt;One downside I do want to note, however, is the non-obvious priority inversion. Remember, from the enqueueing example I gave, how Node2 wasn't technically queued when Thread2 finished? It was only queued when Thread1 finished later on. Now imagine a very low priority thread and a very high priority thread continuously enqueueing items. The low priority thread would run the exchange line, and essentially stall the queue until it updated the .next pointer on the next line. The high priority thread would be appending items, but they would not be dequeueable until the low priority queue finished. In other words, the average delay depends on the slowest producer. Luckily, the buffering effect stops this from affecting the average throughput. I would not recommend this queue for real-time systems where milliseconds count and prioritization is king.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Overly Simple Profiling&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In order to get an idea of the queue contention, I profiled the time it took 1 to 100 threads to queue 10 000 items each. I'm running on a Core2 Duo processor, and the times were measured using GetTickCount, which probably explains why the low data points are a bit wild. I don't see much usefulness in these numbers, but I needed a pretty graph so make of it what you will. I'm open to suggestions for more relevant tests.&lt;br /&gt;&lt;div id="soda" style="text-align: left;"&gt;&lt;img style="width: 625px; height: 301px;" src="http://docs.google.com/File?id=d39r7rf_2c83t4fgv_b" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The completed queue class is posted below, along with comments. The class is 48 lines of code plus 82 lines of comments and white space. Lock-free stuff is not a joke: you have to explain yourself. In my next post I will be discussing futures, which will be another integral part of the call queue coming later on.&lt;br /&gt;&lt;pre&gt;  &lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    ''' A multiple-producer, single-consumer lock-free queue.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    ''' Does NOT guarantee an item has been queued when BeginEnqueue finishes.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    ''' Does guarantee an item will eventually be queued after BeginEnqueue finishes.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    ''' Does guarantee that, for calls simultaneously in BeginEnqueue, at least one will finish with its item having been enqueued.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    ''' Does guarantee that, if BeginEnqueue(Y) is called after BeginEnqueue(X) finishes, Y will follow X in the queue.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;remarks&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    ''' Performance characteristics:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    ''' - All operations are guaranteed constant time.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    ''' - Latency between BeginEnqueue finishing and the item being enqueued can be delayed arbitrarily by slowing down only one of the producers.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    ''' - (How does this compare to CAS-based implementations in terms of average throughput? It should be higher?)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;    ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/remarks&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;SingleConsumerLockFreeQueue&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; T)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Owned by the consumer.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' This node is the end marker of the consumed nodes.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' This node's next is the next node to be consumed.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Private&lt;/span&gt; head &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt; = &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;(&lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' This node is the tail of the last partially or fully inserted chain.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' The next inserted chain will exchange its tail for the insertionPoint, then set the old insertionPoint's next to the chain's head.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Private&lt;/span&gt; insertionPoint &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt; = head&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Singly linked list node containing queue items.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Public&lt;/span&gt; [next] &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.value = value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Begins adding new items to the queue.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' The items may not be dequeueable when this method finishes, but eventually they will be.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' The items are guaranteed to end up adjacent in the queue and in the correct order.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;remarks&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' An example of what can occur when two items are queued simultaneously:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Initial state:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''   insert=head -&gt; null&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''   [queue is empty]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Step 1: First item is created and exchanged with insertion point.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''   head=prev1 -&gt; null&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''   insert=node1 -&gt; null&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''   [queue is empty]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Step 2: Second thread pre-empts and second item is created and exchanged with insertion point.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''   head=prev1 -&gt; null&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''   node1=prev2 -&gt; null&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''   insert=node2 -&gt; null&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''   [queue is empty]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Step 3: Second thread finishes setting prev.next.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''   head=prev1 -&gt; null&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''   node1=prev2 -&gt; insert=node2 -&gt; null&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''   [queue is empty]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Step 4: First thread comes back and finishes setting prev.next.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''   head=prev1 -&gt; node1=prev2 -&gt; insert=node2 -&gt; null&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        '''   [queue contains 2 elements]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/remarks&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;implementation&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Each producer creates a new chain, and exchanges the shared insertion point for the tail of the new chain.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' The producer then links the old insertion point to the head of the new chain.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' A new chain might not be in the main chain when the function exits, but it will be in a chain that will eventually be in the main chain.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/implementation&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; BeginEnqueue(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; items &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; items &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"items"&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Not&lt;/span&gt; items.Any &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Return&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:green;"&gt;'Create new chain&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; chainHead &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt; = &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; chainTail &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt; = &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;For&lt;/span&gt; &lt;span style="color:blue;"&gt;Each&lt;/span&gt; item &lt;span style="color:blue;"&gt;In&lt;/span&gt; items&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;If&lt;/span&gt; chainHead &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                    chainHead = &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;(item)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                    chainTail = chainHead&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;Else&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                    chainTail.next = &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;(item)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                    chainTail = chainTail.next&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;End If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Next&lt;/span&gt; item&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:green;"&gt;'Append chain to previous chain&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; prevChainTail = Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Interlocked&lt;/span&gt;.Exchange(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;.insertionPoint, chainTail)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            prevChainTail.next = chainHead&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Begins adding a new item to the queue.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' The item may not be dequeueable when this method finishes, but eventually it will be.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;implementation&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Just an inlined and simplified version of BeginEnqueue(IEnumerable(Of T))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/implementation&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; BeginEnqueue(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; item &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; chainOfOne = &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Node&lt;/span&gt;(item)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; prevChainTail = Threading.&lt;span style="color: rgb(43, 145, 175);"&gt;Interlocked&lt;/span&gt;.Exchange(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;.insertionPoint, chainOfOne)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            prevChainTail.next = chainOfOne&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Returns true if there were any items in the queue.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' The return value is only stable if the queue is non-empty and you are calling from the consumer thread.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; WasEmpty &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:blue;"&gt;Return&lt;/span&gt; head.next &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Returns the next item in the queue.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' This function must only be called from the consumer thread.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Peek() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; head.next &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"Empty Queue"&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; head.next.value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' Removes and returns an item from the queue.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' This function must only be called from the consumer thread.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Consolas;color:green;"  &gt;&lt;span style="font-size:85%;"&gt;        ''' &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Consolas;color:gray;"  &gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Dequeue() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;If&lt;/span&gt; head.next &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Throw&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"Empty Queue"&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            head = head.next&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:blue;"&gt;Return&lt;/span&gt; head.value&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span color="blue"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-6100736108578904611?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/6100736108578904611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/07/concurrency-1-multiple-producer-single_4365.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/6100736108578904611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/6100736108578904611'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/07/concurrency-1-multiple-producer-single_4365.html' title='Concurrency #1: A Multiple-Producer Single-Consumer Lock Free Queue'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5384926102484105713.post-7657432958005036390</id><published>2009-07-03T17:12:00.002-03:00</published><updated>2009-07-03T17:12:47.565-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Concurrency #0: Teaser</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Introduction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Concurrency (aka multithreading) is hard. No, I mean really hard. You just don’t realize how hard it is until you’ve actually done it. The upcoming posts are going to be all about how I do concurrency in .Net via message-passing. This post is a quick introduction to the series.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The "Simple" Way&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It all seems so easy at first. You’re introduced to the humble lock, an easy way to make sure threads don't run over each other. Just hold the lock, and everything works, right? Then you hit your very first deadlock. Deadlocks are brutal. The simplest deadlock is when two threads acquire the same two locks, but in the opposite order. For example:&lt;br /&gt;1.    Thread 1 - Acquire lock 1.&lt;br /&gt;2.    Thread 2 - Acquire lock 2.&lt;br /&gt;3.    Thread 1 - Block trying to acquire lock 2, because Thread 2 has it.&lt;br /&gt;4.    Thread 2 - Block trying to acquire lock 1, because Thread 1 has it.&lt;br /&gt;Now both threads can't make progress until the other one makes progress, so they're stuck forever. Any other threads that touch the locks are now also going to block forever.&lt;br /&gt;&lt;br /&gt;Concurrent programming with locks is a delicate dance between ensuring the threads don't run over each other and making sure the threads don't deadlock. It's highly non-trivial, because those properties are inherently global. You can't just look at part of the program and know it is correct, you have to look at the program as a whole. Locks also don't compose, meaning if you have two methods which are synchronized using locks, the combination is not synchronized. For example if you only dequeue from a queue when it is not empty, a thread could remove the last element between the check and the dequeue.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Teaser&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Don't despair, there are better ways to do concurrency! In this series, I will be focusing on message passing. I will build .Net classes for message passing, and I will give examples of using them. First up will be a lock free queue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5384926102484105713-7657432958005036390?l=turingmachinesareprograms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://turingmachinesareprograms.blogspot.com/feeds/7657432958005036390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/07/concurrency-0-teaser.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/7657432958005036390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5384926102484105713/posts/default/7657432958005036390'/><link rel='alternate' type='text/html' href='http://turingmachinesareprograms.blogspot.com/2009/07/concurrency-0-teaser.html' title='Concurrency #0: Teaser'/><author><name>Strilanc</name><uri>http://www.blogger.com/profile/09375682759275016445</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_IdZIYasmgVI/Sk1hVNQZmPI/AAAAAAAAAAM/LibG9iCinlw/S220/ErrorIsland.jpg'/></author><thr:total>0</thr:total></entry></feed>
