<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Carl&amp;#39;s Blog</title><subtitle type="html">Carl Nolan&amp;#39;s ramblings on development and data processing</subtitle><id>http://blogs.msdn.com/b/carlnol/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/carlnol/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/carlnol/atom.aspx" /><generator uri="http://telligent.com" version="5.6.50428.7875">Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><updated>2012-07-09T20:17:20Z</updated><entry><title>Hadoop .Net HDFS File Access</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/carlnol/archive/2013/02/08/hdinsight-net-hdfs-file-access.aspx" /><id>http://blogs.msdn.com/b/carlnol/archive/2013/02/08/hdinsight-net-hdfs-file-access.aspx</id><published>2013-02-08T18:22:45Z</published><updated>2013-02-08T18:22:45Z</updated><content type="html">&lt;p&gt;Provided with the Microsoft Distribution of Hadoop, HDInsight, is a C library for HDFS file access. This code extends this library through a Managed C++ solution. This solution enables one to consume HDFS files from within a .Net environment. The purpose of this post is first to ensure folks know about the new Windows HDFS Managed library (WinHdfsManaged) provided alongside the native C library, and secondly to give a few samples of its usage from C#.&lt;/p&gt;  &lt;p&gt;The complete code libraries can be downloaded from here: &lt;a title="http://code.msdn.microsoft.com/Hadoop-Net-HDFS-File-Access-18e9bbee" href="http://code.msdn.microsoft.com/Hadoop-Net-HDFS-File-Access-18e9bbee"&gt;http://code.msdn.microsoft.com/Hadoop-Net-HDFS-File-Access-18e9bbee&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Class Structure&lt;/h3&gt;  &lt;p&gt;Let’s start with a simple class diagram of the Win HDFS Managed library:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-76-metablogapi/7288.WinHdfsManagedModel_5F00_3F8147B3.png"&gt;&lt;img style="border: 0px currentcolor; display: inline; background-image: none;" title="WinHdfsManagedModel" border="0" alt="WinHdfsManagedModel" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-76-metablogapi/2388.WinHdfsManagedModel_5F00_thumb_5F00_0D49D19C.png" width="650" height="656" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The main premise is that the HdfsFileSystem is your starting point, from which one can acquire a HdfsFileStream or a HdfsFileHandle. From the HdfsFileStream you can perform operations one would normally expect when working with .Net Streams. From the HdfsFileHandle you can perform operations analogous to normal HDFS file operations.&lt;/p&gt;  &lt;p&gt;For brevity I have excluded samples using the HdfsFileHandle. So let’s run through some sample file operations.&lt;/p&gt;  &lt;h3&gt;Directory Operations&lt;/h3&gt;  &lt;p&gt;As in all operations one firstly needs to get a connection to the HDFS cluster. This is achieved by calling a Connect() method and specifying the host, name or IP address, and access port:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:dd355403-2e42-4f0c-a9e4-6cb323f7bd94" class="wlWriterSmartContent"&gt;   &lt;div class="code-container"&gt;     &lt;div class="code-titleblock"&gt;Create File System Access&lt;/div&gt;      &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;       &lt;ol style="background: rgb(222, 222, 222); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;         &lt;li&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileSystem&lt;/span&gt; hdfsSystem = &lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileSystem&lt;/span&gt;.Connect(&lt;span style="color: rgb(163, 21, 21);"&gt;&amp;quot;127.0.0.1&amp;quot;&lt;/span&gt;, 9000))&lt;/li&gt;          &lt;li class="code-even"&gt;{&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; ...&lt;/li&gt;          &lt;li class="code-even"&gt;}&lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Once one has the connection one can then easily perform a directory traversal to enquire into the files and directories:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e0bc866c-c9ad-460d-8049-d78534ccf0ab" class="wlWriterSmartContent"&gt;   &lt;div class="code-container"&gt;     &lt;div class="code-titleblock"&gt;List Directory Structure&lt;/div&gt;      &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;       &lt;ol style="background: rgb(222, 222, 222); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;         &lt;li&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;&amp;gt; processDirectory = &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;;&lt;/li&gt;          &lt;li class="code-even"&gt;processDirectory = (looppath) =&amp;gt;&lt;/li&gt;          &lt;li&gt;{&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileInfoEntries&lt;/span&gt; entries = hdfsSystem.ListDirectory(looppath))&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;foreach&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileInfoEntry&lt;/span&gt; entry &lt;span style="color: rgb(0, 0, 255);"&gt;in&lt;/span&gt; entries.Entries)&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; kind = entry.Kind == &lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileInfoEntryKind&lt;/span&gt;.Directory ? &lt;span style="color: rgb(163, 21, 21);"&gt;&amp;quot;Directory&amp;quot;&lt;/span&gt; : &lt;span style="color: rgb(163, 21, 21);"&gt;&amp;quot;\tFile&amp;quot;&lt;/span&gt;;&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;.Format(&lt;span style="color: rgb(163, 21, 21);"&gt;@&amp;quot;{0}:&amp;quot;&amp;quot;{1}&amp;quot;&amp;quot;, Modified/Accessed:&amp;quot;&amp;quot;{2:G}, {3:G}&amp;quot;&amp;quot;, Owner:&amp;quot;&amp;quot;{4}&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;, kind, entry.Name, entry.LastModified, entry.LastAccessed, entry.Owner));&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (entry.Kind == &lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileInfoEntryKind&lt;/span&gt;.Directory)&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; processDirectory(entry.Name);&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/li&gt;          &lt;li class="code-even"&gt;};&lt;/li&gt;          &lt;li&gt;processDirectory(hdfspath)&lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Here is a sample output created from the test application:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:864e0f0e-7989-4194-9c35-15f1eaa7a2c6" class="wlWriterSmartContent"&gt;   &lt;div class="code-container"&gt;     &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;       &lt;ol style="background: rgb(222, 222, 222); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;         &lt;li&gt;Directory:&amp;quot;hdfs://127.0.0.1:9000/user/isotope/qwanchi&amp;quot;, Modified/Accessed:&amp;quot;30/01/2012 20:46:38, 01/01/1970 00:00:00&amp;quot;, Owner:&amp;quot;isotope&amp;quot;&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; File:&amp;quot;hdfs://127.0.0.1:9000/user/isotope/qwanchi/MobileSampleData.txt&amp;quot;, Modified/Accessed:&amp;quot;30/01/2012 20:46:38, 30/01/2012 20:46:38&amp;quot;, Owner:&amp;quot;isotope&amp;quot;&lt;/li&gt;          &lt;li&gt;Directory:&amp;quot;hdfs://127.0.0.1:9000/user/isotope/qwanchi/duplicate&amp;quot;, Modified/Accessed:&amp;quot;30/01/2012 20:46:38, 01/01/1970 00:00:00&amp;quot;, Owner:&amp;quot;isotope&amp;quot;&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; File:&amp;quot;hdfs://127.0.0.1:9000/user/isotope/qwanchi/duplicate/testdata.txt&amp;quot;, Modified/Accessed:&amp;quot;30/01/2012 20:46:38, 30/01/2012 20:46:38&amp;quot;, Owner:&amp;quot;isotope&amp;quot;&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; File:&amp;quot;hdfs://127.0.0.1:9000/user/isotope/qwanchi/testdata.txt&amp;quot;, Modified/Accessed:&amp;quot;28/01/2012 20:46:38, 29/01/2012 20:46:38&amp;quot;, Owner:&amp;quot;isotope&amp;quot;&lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In addition to getting directory information one can also query on a file or directory directly: &lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8eedb2cf-db9d-4b83-8d4e-56546d427a60" class="wlWriterSmartContent"&gt;   &lt;div class="code-container"&gt;     &lt;div class="code-titleblock"&gt;Get Path Information&lt;/div&gt;      &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;       &lt;ol style="background: rgb(222, 222, 222); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;         &lt;li&gt;hdfsSystem.SetWorkingDirectory(hdfspath);&lt;/li&gt;          &lt;li class="code-even"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileInfoEntry&lt;/span&gt; pathinfo = hdfsSystem.GetPathInfo(hdfspath))&lt;/li&gt;          &lt;li&gt;{&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (pathinfo != &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;)&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; kind = pathinfo.Kind == &lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileInfoEntryKind&lt;/span&gt;.Directory ? &lt;span style="color: rgb(163, 21, 21);"&gt;&amp;quot;Directory&amp;quot;&lt;/span&gt; : &lt;span style="color: rgb(163, 21, 21);"&gt;&amp;quot;\tFile&amp;quot;&lt;/span&gt;;&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;.Format(&lt;span style="color: rgb(163, 21, 21);"&gt;@&amp;quot;{0}:&amp;quot;&amp;quot;{1}&amp;quot;&amp;quot;, Modified/Accessed:&amp;quot;&amp;quot;{2:G}, {3:G}&amp;quot;&amp;quot;, Owner:&amp;quot;&amp;quot;{4}&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;, kind, pathinfo.Name, pathinfo.LastModified, pathinfo.LastAccessed, pathinfo.Owner));&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/li&gt;          &lt;li&gt;}&lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The HdfsFileSystem class also supports other operations such as copying and moving files, file renaming, deleting files, modifying security, checking a file exists, etc. The copy and move operations support copying and moving these files between systems.&lt;/p&gt;  &lt;p&gt;So now onto creating and reading files.&lt;/p&gt;  &lt;h3&gt;Reading Files&lt;/h3&gt;  &lt;p&gt;Processing HDFS files is not that dissimilar from normal .Net file operations. Once one has opened a file for reading, operations are available for operations such as reading a byte, line, or block of bytes:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5ff77374-9fc8-4daa-ae08-dae558399feb" class="wlWriterSmartContent"&gt;   &lt;div class="code-container"&gt;     &lt;div class="code-titleblock"&gt;Reading Stream File Data&lt;/div&gt;      &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;       &lt;ol style="background: rgb(222, 222, 222); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;         &lt;li&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileStream&lt;/span&gt; file = hdfsSystem.OpenFileStream(filename, &lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileAccess&lt;/span&gt;.Write, chunksize))&lt;/li&gt;          &lt;li class="code-even"&gt;{&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; file.Write(dataBytes, 0, data.Length);&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; file.WriteByte((&lt;span style="color: rgb(0, 0, 255);"&gt;byte&lt;/span&gt;)47);&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; file.Flush();&lt;/li&gt;          &lt;li class="code-even"&gt;}&lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The OpenFile operations support parameter overrides for the file block size and replication factors, whereas a value of zero implies the default values will be used.&lt;/p&gt;  &lt;p&gt;If one wants to read the full contents of a file into a second Stream, the HdfsFileStream makes this a simple process:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d86c5c70-9150-46da-87bf-8cfbee2e428d" class="wlWriterSmartContent"&gt;   &lt;div class="code-container"&gt;     &lt;div class="code-titleblock"&gt;Reading a File by Stream&lt;/div&gt;      &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;       &lt;ol style="background: rgb(222, 222, 222); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;         &lt;li&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileStream&lt;/span&gt; hdfsStream = hdfsSystem.OpenFileStream(localhdfsfilename, &lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileAccess&lt;/span&gt;.Read))&lt;/li&gt;          &lt;li class="code-even"&gt;{&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;FileStream&lt;/span&gt; fileStream = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;FileStream&lt;/span&gt;(localfilestream, &lt;span style="color: rgb(43, 145, 175);"&gt;FileMode&lt;/span&gt;.Create, &lt;span style="color: rgb(43, 145, 175);"&gt;FileAccess&lt;/span&gt;.Write))&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; hdfsStream.CopyTo(fileStream);&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/li&gt;          &lt;li&gt;}&lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;There are other options available for reading the full contents of a file. The first option is to perform a ReadLine() until a null is returned, processed using a StreamReader:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c4c63b1e-c1a1-4fc8-babd-ce9fb8e49e92" class="wlWriterSmartContent"&gt;   &lt;div class="code-container"&gt;     &lt;div class="code-titleblock"&gt;Writing a HDFS to Local Stream&lt;/div&gt;      &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;       &lt;ol style="background: rgb(222, 222, 222); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;         &lt;li&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;StreamReader&lt;/span&gt; reader = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;StreamReader&lt;/span&gt;(hdfsSystem.OpenFileStream(localhdfsfilename, &lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileAccess&lt;/span&gt;.Read, chunksize)))&lt;/li&gt;          &lt;li class="code-even"&gt;{&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;StreamWriter&lt;/span&gt; writer = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;StreamWriter&lt;/span&gt;(localfileline, &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;, &lt;span style="color: rgb(43, 145, 175);"&gt;Encoding&lt;/span&gt;.UTF8))&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; line;&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;while&lt;/span&gt; ((line = reader.ReadLine()) != &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;)&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.WriteLine(line);&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/li&gt;          &lt;li&gt;}&lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Alternatively, for more efficient reading of files, one can read the blocks of data into a byte array: &lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b02ffd15-4450-462e-982f-c506d7da4746" class="wlWriterSmartContent"&gt;   &lt;div class="code-container"&gt;     &lt;div class="code-titleblock"&gt;Reading a File in Bytes&lt;/div&gt;      &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;       &lt;ol style="background: rgb(222, 222, 222); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;         &lt;li&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileStream&lt;/span&gt; file = hdfsSystem.OpenFileStream(filename, &lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileAccess&lt;/span&gt;.Read))&lt;/li&gt;          &lt;li class="code-even"&gt;{&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;while&lt;/span&gt; ((chunk = file.Read(readBytes, 0, chunksize)) &amp;gt; 0)&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: rgb(43, 145, 175);"&gt;Encoding&lt;/span&gt;.UTF8.GetString(readBytes, 0, chunk));&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/li&gt;          &lt;li&gt;}&lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Other operations that are supported are PositionalReadByte(), PositionalReadBytes(), and Seek(). These operations allow reading the contents of a file from specific positions.&lt;/p&gt;  &lt;p&gt;One final sample worth noting is copying a HDFS file to a local file using byte reads:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:497129e8-70a2-4c91-a52c-a5d599f4002d" class="wlWriterSmartContent"&gt;   &lt;div class="code-container"&gt;     &lt;div class="code-titleblock"&gt;Writing a HDFS to Local File&lt;/div&gt;      &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;       &lt;ol style="background: rgb(222, 222, 222); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;         &lt;li&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileStream&lt;/span&gt; file = hdfsSystem.OpenFileStream(localhdfsfilename, &lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileAccess&lt;/span&gt;.Read, chunksize))&lt;/li&gt;          &lt;li class="code-even"&gt;{&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;FileStream&lt;/span&gt; stream = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;FileStream&lt;/span&gt;(localfilewrite, &lt;span style="color: rgb(43, 145, 175);"&gt;FileMode&lt;/span&gt;.Create, &lt;span style="color: rgb(43, 145, 175);"&gt;FileAccess&lt;/span&gt;.Write))&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;while&lt;/span&gt; ((chunk = file.Read(readBytes, 0, chunksize)) &amp;gt; 0)&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; stream.Write(readBytes, 0, chunk);&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/li&gt;          &lt;li class="code-even"&gt;}&lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The reason a chunk size is specified in this case is to sync the size being used for HDFS file access to the byte array used for writing the local file.&lt;/p&gt;  &lt;p&gt;If one has a Stream reference one can also get the associated file information:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:bcd7a0bf-9862-4b8b-b81d-d6a203ab717d" class="wlWriterSmartContent"&gt;   &lt;div class="code-container"&gt;     &lt;div class="code-titleblock"&gt;Get File Information&lt;/div&gt;      &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;       &lt;ol style="background: rgb(222, 222, 222); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;         &lt;li&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileInfoEntry&lt;/span&gt; fileinfo = file.GetInformation();&lt;/li&gt;          &lt;li class="code-even"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (fileinfo != &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;)&lt;/li&gt;          &lt;li&gt;{&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;.Format(&lt;span style="color: rgb(163, 21, 21);"&gt;@&amp;quot;'{0}', Modified/Accessed:&amp;quot;&amp;quot;{1:G}, {2:G}&amp;quot;&amp;quot;, Owner:&amp;quot;&amp;quot;{3}&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;, fileinfo.Name, fileinfo.LastModified, fileinfo.LastAccessed, fileinfo.Owner));&lt;/li&gt;          &lt;li&gt;}&lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Also one can modify the file properties:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:72319b8a-dee1-4743-ae3f-acd48fc0709f" class="wlWriterSmartContent"&gt;   &lt;div class="code-container"&gt;     &lt;div class="code-titleblock"&gt;Modifying File Properties&lt;/div&gt;      &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;       &lt;ol style="background: rgb(222, 222, 222); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;         &lt;li&gt;file.Chown(&lt;span style="color: rgb(163, 21, 21);"&gt;&amp;quot;isotope&amp;quot;&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;);&lt;/li&gt;          &lt;li class="code-even"&gt;file.SetTimes(&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;.Now.AddDays(-2), &lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;.Now.AddDays(-1));&lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;So now onto writing files.&lt;/p&gt;  &lt;h3&gt;Writing Files&lt;/h3&gt;  &lt;p&gt;As in the case for reading, writing operations are supported for writing a byte, line, and block of bytes:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f16a0d78-4699-48bb-b12d-5ee8c312cff3" class="wlWriterSmartContent"&gt;   &lt;div class="code-container"&gt;     &lt;div class="code-titleblock"&gt;Writing File Stream Data&lt;/div&gt;      &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;       &lt;ol style="background: rgb(222, 222, 222); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;         &lt;li&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileStream&lt;/span&gt; file = hdfsSystem.OpenFileStream(filename, &lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileAccess&lt;/span&gt;.Write, chunksize))&lt;/li&gt;          &lt;li class="code-even"&gt;{&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; file.Write(dataBytes, 0, data.Length);&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; file.WriteByte((&lt;span style="color: rgb(0, 0, 255);"&gt;byte&lt;/span&gt;)47);&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; file.Flush();&lt;/li&gt;          &lt;li class="code-even"&gt;}&lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The chunk size when opening a file is set to correspond to the size of the buffer used for writing the data.&lt;/p&gt;  &lt;p&gt;As in the reading case, if one wants to copy a file from the local file system to an HDFS file one would write:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9efc58ad-50a1-448c-9ec2-c026662d926b" class="wlWriterSmartContent"&gt;   &lt;div class="code-container"&gt;     &lt;div class="code-titleblock"&gt;Writing a Local to HDFS Stream&lt;/div&gt;      &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;       &lt;ol style="background: rgb(222, 222, 222); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;         &lt;li&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileStream&lt;/span&gt; file = hdfsSystem.OpenFileStream(localhdfsfilename, &lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileAccess&lt;/span&gt;.Write, chunksize))&lt;/li&gt;          &lt;li class="code-even"&gt;{&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;FileStream&lt;/span&gt; stream = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;FileStream&lt;/span&gt;(localfilepath, &lt;span style="color: rgb(43, 145, 175);"&gt;FileMode&lt;/span&gt;.Open, &lt;span style="color: rgb(43, 145, 175);"&gt;FileAccess&lt;/span&gt;.Read))&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;while&lt;/span&gt; ((chunk = stream.Read(localbytes, 0, chunksize)) &amp;gt; 0)&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write(localbytes, 0, chunk);&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; file.Flush();&lt;/li&gt;          &lt;li class="code-even"&gt;}&lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;All one has to do is read, in byte chunks, data from the local file and write the corresponding bytes to the HDFS file.&lt;/p&gt;  &lt;p&gt;Of course one can also use the CopyTo operation:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a7f95e9b-f1c7-4f02-aaf8-7a9063d8dc7c" class="wlWriterSmartContent"&gt;   &lt;div class="code-container"&gt;     &lt;div class="code-titleblock"&gt;CopyTo Local to HDFS Stream&lt;/div&gt;      &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;       &lt;ol style="background: rgb(222, 222, 222); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;         &lt;li&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileStream&lt;/span&gt; file = hdfsSystem.OpenFileStream(localhdfsfilename, &lt;span style="color: rgb(43, 145, 175);"&gt;HdfsFileAccess&lt;/span&gt;.Write, chunksize))&lt;/li&gt;          &lt;li class="code-even"&gt;{&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;FileStream&lt;/span&gt; stream = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;FileStream&lt;/span&gt;(localfilepath, &lt;span style="color: rgb(43, 145, 175);"&gt;FileMode&lt;/span&gt;.Open, &lt;span style="color: rgb(43, 145, 175);"&gt;FileAccess&lt;/span&gt;.Read))&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; stream.CopyTo(file);&lt;/li&gt;          &lt;li class="code-even"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/li&gt;          &lt;li&gt;}&lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;A quick word is warranted on appending to a file. Although the API currently supports open files for Append, this is only supported in Hadoop version 1.0.0 and above.&lt;/p&gt;  &lt;h3&gt;Building the Library&lt;/h3&gt;  &lt;p&gt;The download not only consists of the compiled libraries but also the full source code and sample C# application that this post is based upon. The source supports both x86 and x64 compilations. However one has to remember that if one does a 32-bit compilation then a 32-bit version of the JRE will also be required.&lt;/p&gt;  &lt;p&gt;In the Native library the include path is defined as:&lt;/p&gt;  &lt;p&gt;$(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(IncludePath)&lt;/p&gt;  &lt;p&gt;If your environment variable is not correctly defined for the Java include directory this will have to be modified.&lt;/p&gt;  &lt;p&gt;Happy HDFS file access!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10392238" width="1" height="1"&gt;</content><author><name>Carl Nolan</name><uri>http://blogs.msdn.com/carlnolan/ProfileUrlRedirect.ashx</uri></author><category term="C#" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/C_2300_/" /><category term=".Net" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/-Net/" /><category term="WinHDFS" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/WinHDFS/" /><category term="HDFS" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/HDFS/" /><category term="C++" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/C_2B002B00_/" /><category term=".Net Programming" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/-Net+Programming/" /></entry><entry><title>Submitting Hadoop MapReduce Jobs using PowerShell</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/carlnol/archive/2013/02/05/submitting-hadoop-mapreduce-jobs-using-powershell.aspx" /><id>http://blogs.msdn.com/b/carlnol/archive/2013/02/05/submitting-hadoop-mapreduce-jobs-using-powershell.aspx</id><published>2013-02-05T13:04:17Z</published><updated>2013-02-05T13:04:17Z</updated><content type="html">&lt;p&gt;As always here is a link to the “&lt;a href="http://code.msdn.microsoft.com/Framework-for-Composing-af656ef7"&gt;Generics based Framework for .Net Hadoop MapReduce Job Submission&lt;/a&gt;” code. &lt;/p&gt;  &lt;p&gt;In all the samples I have shown so far I have always used the command-line consoles. However this does not need to be the case, PowerShell can be used. The Console application which is used to submit the MapReduce jobs call a .Net Submissions API. As such one can call the .Net API directly from within PowerShell; as I will now demonstrate.&lt;/p&gt;  &lt;p&gt;The key types one needs to be concerned with are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;MSDN.Hadoop.Submission.Api.SubmissionContext – The type containing the job submission options&lt;/li&gt;    &lt;li&gt;MSDN.Hadoop.Submission.Api.SubmissionApi – The type used for submitting the job&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;To use the .Net API one firstly has to create the two required objects:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;$SubmitterApi = $BasePath + &amp;quot;\Release\MSDN.Hadoop.Submission.Api.dll&amp;quot;     &lt;br /&gt;Add-Type -Path $SubmitterApi      &lt;br /&gt;$context = New-Object -TypeName MSDN.Hadoop.Submission.Api.SubmissionContext      &lt;br /&gt;$submitter = New-Object -TypeName MSDN.Hadoop.Submission.Api.SubmissionApi&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;After this one just has to define the context with the necessary job submission properties:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;[string[]]$inputs = @(&amp;quot;mobile/data&amp;quot;)     &lt;br /&gt;[string[]]$files = @($BasePath + &amp;quot;\Sample\MSDN.Hadoop.MapReduceCSharp.dll&amp;quot;) &lt;/font&gt;&lt;/p&gt; &lt;font face="Consolas"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;$config = New-Object 'Tuple[string,string]'(&amp;quot;DictionaryCapacity&amp;quot;, &amp;quot;1000&amp;quot;)     &lt;br /&gt;$configs = @($config)&lt;/font&gt;&lt;/p&gt; &lt;font face="Consolas"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;$context.InputPaths = $inputs     &lt;br /&gt;$context.OutputPath = &amp;quot;mobile/querytimes&amp;quot;      &lt;br /&gt;$context.MapperType = &amp;quot;MSDN.Hadoop.MapReduceCSharp.MobilePhoneRangeMapper, MSDN.Hadoop.MapReduceCSharp&amp;quot;      &lt;br /&gt;$context.ReducerType = &amp;quot;MSDN.Hadoop.MapReduceCSharp.MobilePhoneRangeReducer, MSDN.Hadoop.MapReduceCSharp&amp;quot;      &lt;br /&gt;$context.Files = $files      &lt;br /&gt;$context.ExeConfigurations = $configs&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;One just has to remember that the input and files specifications are defined as string arrays. &lt;/p&gt;  &lt;p&gt;In a recent build I added support for adding user-defined key-value pairs to the application configuration file. This ExeConfigurations property expects an array of Tuple&amp;lt;string, String&amp;gt; types, hence the object definition for the $config value.&lt;/p&gt;  &lt;p&gt;Optionally one can also set the Data and Output format types:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;$context.DataFormat = [MSDN.Hadoop.Submission.Api.DataFormat]::Text     &lt;br /&gt;$context.OutputFormat = [MSDN.Hadoop.Submission.Api.OutputFormat]::Text&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;However, this is not necessary if one is using the default Text values.&lt;/p&gt;  &lt;p&gt;Once the context has been defined one just has to run the job:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;$submitter.RunContext($context)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;To call the PowerShell script from the Hadoop command-line once can use:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;powershell -ExecutionPolicy unrestricted /File %BASEPATH%\SampleScripts\hadoopcstextrangesubmit.ps1&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;All in all a simple process.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10391190" width="1" height="1"&gt;</content><author><name>Carl Nolan</name><uri>http://blogs.msdn.com/carlnolan/ProfileUrlRedirect.ashx</uri></author><category term="Hadoop" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop/" /><category term="MapReduce" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/MapReduce/" /><category term=".Net" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/-Net/" /><category term="Hadoop.Net" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop-Net/" /><category term="PowerShell" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/PowerShell/" /></entry><entry><title>Try F# 3.0 Released</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/carlnol/archive/2013/01/23/try-f-3-0-released.aspx" /><id>http://blogs.msdn.com/b/carlnol/archive/2013/01/23/try-f-3-0-released.aspx</id><published>2013-01-23T10:08:06Z</published><updated>2013-01-23T10:08:06Z</updated><content type="html">&lt;p&gt;&lt;span style="font-family: arial,helvetica,sans-serif; font-size: small;"&gt;From the F# Team Blog:&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: arial,helvetica,sans-serif; font-size: small;"&gt;If you're familiar with the site Try F#, which lets you run F# right in your browser, you'll be happy to hear that the Try F# team has launched &lt;a href="http://www.tryfsharp.org/"&gt;Try F# 3.0&lt;/a&gt; today! You will find updated content and tutorials, plus content that is tailored to particular areas--such as data science, numerical and scientific computing, and financial computing. &lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: arial,helvetica,sans-serif; font-size: small;"&gt;Aside from supporting all of the features of F# 3.0, &lt;a href="http://www.tryfsharp.org/"&gt;Try F# 3.0&lt;/a&gt; includes an enhanced user interface, support for graphs and charting, and the ability to share snippets of code with other programmers.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: arial,helvetica,sans-serif; font-size: small;"&gt;Try it today and don't forget to participate on the&amp;nbsp;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/fsharpgeneral/threads"&gt;F# MSDN forum&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10387502" width="1" height="1"&gt;</content><author><name>Carl Nolan</name><uri>http://blogs.msdn.com/carlnolan/ProfileUrlRedirect.ashx</uri></author><category term="F#" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/F_2300_/" /></entry><entry><title>Hive and XML File Processing</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/carlnol/archive/2012/12/13/hive-and-xml-file-processing.aspx" /><id>http://blogs.msdn.com/b/carlnol/archive/2012/12/13/hive-and-xml-file-processing.aspx</id><published>2012-12-13T19:42:52Z</published><updated>2012-12-13T19:42:52Z</updated><content type="html">&lt;p&gt;When I put together the “&lt;a href="http://code.msdn.microsoft.com/Framework-for-Composing-af656ef7"&gt;Generics based Framework for .Net Hadoop MapReduce Job Submission&lt;/a&gt;” code one of the goals was to support XML file processing. This was achieved by the creation of a modified Mahout document reader where one can specify the XML node to be presented for processing. But what if ones wants to process XML documents in Hive. Fortunately Hive similarly supports document readers, thus enabling the same document readers to be used as the basis of table definitions.&lt;/p&gt;  &lt;p&gt;The process of enabling XML processing in Hive is relatively straightforward:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Create the table definition specifying that the input format is XML; thus exposing the necessary XML elements as columns&lt;/li&gt;    &lt;li&gt;Parse the XML column data using xpath expressions in SELECT statements&lt;/li&gt;    &lt;li&gt;or – Define a view on the XML table parsing out the relevant XML elements, returning them as native types&lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;The syntax for the xpath processing in Hive can be found at: &lt;a title="https://cwiki.apache.org/confluence/display/Hive/LanguageManual+XPathUDF" href="https://cwiki.apache.org/confluence/display/Hive/LanguageManual+XPathUDF"&gt;https://cwiki.apache.org/confluence/display/Hive/LanguageManual+XPathUDF&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So onto a simple example.&lt;/p&gt;  &lt;p&gt;In “SampleScripts” folder of the MapReduce Framework download there is a script that extracts Store information, in XML format, from the sample AdventureWorks database. A sample of the output is as follows:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d4cfe8cf-8a24-4bdc-bbcb-6d720a738953" class="wlWriterSmartContent"&gt;    &lt;div style="border: 1px solid rgb(0, 0, 128); color: rgb(0, 0, 0); font-family: &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 10pt;"&gt;      &lt;div style="background: rgb(255, 255, 255); overflow: auto;"&gt;        &lt;ol style="background: rgb(255, 255, 255); margin: 0px; padding: 0px 0px 0px 5px; white-space: nowrap;"&gt;          &lt;li&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Root&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Store&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;BusinessEntityID&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;292&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;BusinessEntityID&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Name&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;Next-Door Bike Store&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Name&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;SalesPersonID&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;279&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;SalesPersonID&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Demographics&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;StoreSurvey&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt; &lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(255, 0, 0);"&gt;xmlns&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;AnnualSales&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;800000&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;AnnualSales&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;AnnualRevenue&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;80000&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;AnnualRevenue&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;BankName&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;United Security&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;BankName&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;BusinessType&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;BM&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;BusinessType&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;YearOpened&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;1996&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;YearOpened&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Specialty&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;Mountain&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Specialty&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;SquareFeet&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;21000&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;SquareFeet&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Brands&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;2&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Brands&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Internet&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;ISDN&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Internet&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;NumberEmployees&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;13&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;NumberEmployees&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;StoreSurvey&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Demographics&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Modified&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;2008-10-13T11:15:07.497&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Modified&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Store&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;...&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Store&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;BusinessEntityID&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;374&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;BusinessEntityID&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Name&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;Immense Manufacturing Company&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Name&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;SalesPersonID&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;277&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;SalesPersonID&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Demographics&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;StoreSurvey&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt; &lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(255, 0, 0);"&gt;xmlns&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;AnnualSales&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;3000000&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;AnnualSales&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;AnnualRevenue&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;300000&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;AnnualRevenue&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;BankName&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;Guardian Bank&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;BankName&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;BusinessType&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;OS&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;BusinessType&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;YearOpened&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;1998&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;YearOpened&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Specialty&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;Touring&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Specialty&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;SquareFeet&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;76000&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;SquareFeet&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Brands&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;4+&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Brands&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Internet&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;DSL&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Internet&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;NumberEmployees&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;73&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;NumberEmployees&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;StoreSurvey&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Demographics&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Modified&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 0);"&gt;2008-10-13T11:15:07.497&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Modified&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li style="background: rgb(243, 243, 243);"&gt;&amp;#160; &lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Store&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(163, 21, 21);"&gt;Root&lt;/span&gt;&lt;span style="background: rgb(255, 255, 255); color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;  &lt;/ol&gt;  &lt;/div&gt;  &lt;/div&gt;  &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The record reader to be used will be “XmlElementStreamingInputFormat”. This document reader using a configuration element to define the XML node to be located, which then outputs for each row a single column consisting of the complete node contents.&lt;/p&gt;  &lt;p&gt;Using this record reader a table can be defined consisting of a single XML column:&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Consolas"&gt;add JARS file:///C:/Users/Carl/Projects/MSDN.Hadoop.MapReduce/Release/msdn.hadoop.readers.jar;      &lt;br /&gt; set xmlinput.element=Store;&lt;/font&gt;&lt;/p&gt;  &lt;font size="1" face="Consolas"&gt;&lt;/font&gt;  &lt;p&gt;&lt;font size="1" face="Consolas"&gt;CREATE EXTERNAL TABLE StoresXml (storexml string)      &lt;br /&gt; STORED AS INPUTFORMAT 'msdn.hadoop.mapreduce.input.XmlElementStreamingInputFormat'       &lt;br /&gt; OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'       &lt;br /&gt; LOCATION '/user/Carl/stores/demographics';&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The INPUTFORMAT option allows for the definition of the required document reader. The OUTPUTFORMAT specified is the default for Hive. In this example I have defined an EXTERNAL table over the directory containing the extracted XML; independently copied to the Hadoop cluster.&lt;/p&gt;  &lt;p&gt;The ADD JARS statement ensures the document reader is available for job execution. The SET statement configures the job such that the document reader knows what XML node to extract.&lt;/p&gt;  &lt;p&gt;Once this table is defined you can use it like any other Hive table. If one selects from this table you will get each Store element as a row. However, xpath processing allows you to extract the XML attributes as native types.&lt;/p&gt;  &lt;p&gt;In addition to SELECT operations one also has the option of creating a VIEW that parses the XML and presents the data using native types:&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Consolas"&gt;CREATE VIEW Stores(BusinessEntityID, BusinessType, BankName, AnnualSales, AnnualRevenue) AS      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; SELECT       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xpath_int (storexml, '/Store/BusinessEntityID'),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xpath_string (storexml, '/Store/Demographics/*[local-name()=\'StoreSurvey\']/*[local-name()=\'BusinessType\']'),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xpath_string (storexml, '/Store/Demographics/*[local-name()=\'StoreSurvey\']/*[local-name()=\'BankName\']'),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xpath_double (storexml, '/Store/Demographics/*[local-name()=\'StoreSurvey\']/*[local-name()=\'AnnualSales\']'),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xpath_double (storexml, '/Store/Demographics/*[local-name()=\'StoreSurvey\']/*[local-name()=\'AnnualRevenue\']')       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; FROM StoresXml;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Using the Stores definition one can now process the XML data files through the normal Hive operations. Continuing with the same samples in the download one can now easily generate a revenue summary across the banks:&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Consolas"&gt;SELECT BusinessType, BankName, CAST(SUM(AnnualSales) AS INT) AS TotalSales FROM Stores      &lt;br /&gt; GROUP BY BusinessType, BankName;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;As expected, under the covers the necessary MapReduce jobs are executed to aggregate the data, returning:&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Consolas"&gt;BM&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Guardian Bank&amp;#160;&amp;#160; 43200000      &lt;br /&gt; BM&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; International Bank&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 43200000       &lt;br /&gt; BM&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; International Security&amp;#160; 43200000       &lt;br /&gt; BM&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Primary Bank &amp;amp; Reserve&amp;#160; 42800000       &lt;br /&gt; BM&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Primary International&amp;#160;&amp;#160; 42200000       &lt;br /&gt; BM&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Reserve Security&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 42200000       &lt;br /&gt; BM&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; United Security 42200000       &lt;br /&gt; BS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Guardian Bank&amp;#160;&amp;#160; 88400000       &lt;br /&gt; BS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; International Bank&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 87400000       &lt;br /&gt; BS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; International Security&amp;#160; 88400000       &lt;br /&gt; BS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Primary Bank &amp;amp; Reserve&amp;#160; 88400000       &lt;br /&gt; BS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Primary International&amp;#160;&amp;#160; 87400000       &lt;br /&gt; BS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Reserve Security&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 87400000       &lt;br /&gt; BS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; United Security 87400000       &lt;br /&gt; OS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Guardian Bank&amp;#160;&amp;#160; 192000000       &lt;br /&gt; OS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; International Bank&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 186000000       &lt;br /&gt; OS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; International Security&amp;#160; 186000000       &lt;br /&gt; OS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Primary Bank &amp;amp; Reserve&amp;#160; 186000000       &lt;br /&gt; OS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Primary International&amp;#160;&amp;#160; 186000000       &lt;br /&gt; OS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Reserve Security&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 186000000       &lt;br /&gt; OS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; United Security 186000000&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;If you download the aforementioned code, the sample for the Hive execution can be found in the “SampleScripts” folder. The “DocumentInputReaders” folder also contains the XML document reader classes along with a usable JAR file.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10377859" width="1" height="1"&gt;</content><author><name>Carl Nolan</name><uri>http://blogs.msdn.com/carlnolan/ProfileUrlRedirect.ashx</uri></author><category term="Hadoop" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop/" /><category term="Hadoop on Azure" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop+on+Azure/" /><category term="XML Streaming" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/XML+Streaming/" /><category term="Hive" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hive/" /><category term="xpath" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/xpath/" /></entry><entry><title>Co-occurrence Approach to an Item Based Recommender Update</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/carlnol/archive/2012/12/05/co-occurrence-approach-to-an-item-based-recommender-update.aspx" /><id>http://blogs.msdn.com/b/carlnol/archive/2012/12/05/co-occurrence-approach-to-an-item-based-recommender-update.aspx</id><published>2012-12-05T17:30:06Z</published><updated>2012-12-05T17:30:06Z</updated><content type="html">&lt;p&gt;In a previous post I talked about a &lt;a href="http://blogs.msdn.com/b/carlnol/archive/2012/06/23/co-occurrence-approach-to-an-item-based-recommender.aspx" target="_blank"&gt;Co-occurrence Approach to an Item Based Recommender&lt;/a&gt;, that utilized the &lt;a href="http://numerics.mathdotnet.com/" target="_blank"&gt;Math.Net Numerics&lt;/a&gt; library. Recently the Math.Net Numerics library was updated to version 2.3.0. With this version of the library I was able to update the code to more efficiently read the Sparse Matrix entries. As such I have updated the code to reflect these library changes:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://code.msdn.microsoft.com/Co-occurrence-Approach-to-57027db7" href="http://code.msdn.microsoft.com/Co-occurrence-Approach-to-57027db7"&gt;http://code.msdn.microsoft.com/Co-occurrence-Approach-to-57027db7&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The new Mat.Net Numerics Library changes were around the storage of the Vector and Matrix elements. As such I was now able to access the storage directly and use the &lt;a href="http://en.wikipedia.org/wiki/Sparse_matrix" target="_blank"&gt;Compress Sparse Row&lt;/a&gt; Matrix format to more efficiently access the Sparse Matrix elements.&lt;/p&gt;  &lt;p&gt;The original code that accessed the elements of the Sparse Matrix was a simple row/column traverse:&lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:dba20be6-3c76-47a1-a676-bb4c3514d4aa" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; getQueue (products:int array) =         &lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Define the priority queue and lookup table&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; queue = PriorityQueue(coMatrix.ColumnCount)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; lookup = HashSet(products)&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Add the items into a priority queue&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;products&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;|&amp;gt; Array.iter (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;fun&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; item &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; itemIdx = item - offset&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; itemIdx &amp;gt;= 0 &amp;amp;&amp;amp; itemIdx &amp;lt; coMatrix.ColumnCount &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;then&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;seq&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; { &lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;for&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; idx = 0 &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;to&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (coMatrix.ColumnCount - 1) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;do&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; productIdx = idx + offset&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; item = coMatrix.[itemIdx, idx]&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (not (lookup.Contains(productIdx))) &amp;amp;&amp;amp; (item &amp;gt; 0.0) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;then&lt;/span&gt;&lt;br&gt;                         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; KeyValuePair(item, productIdx)&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;|&amp;gt; queue.Merge)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Return the queue&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;queue&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Now one has access to the storage elements I was able to more efficiently access just the sparse element values:&lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:01d5ee44-dcd4-4a4f-8dc4-6055a9e70ce3" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;products&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;|&amp;gt; Array.iter (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;fun&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; item &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; itemIdx = item - offset&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; sparse = coMatrix.Storage :?&amp;gt; SparseCompressedRowMatrixStorage&amp;lt;double&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; last = sparse.RowPointers.Length - 1 &lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; itemIdx &amp;gt;= 0 &amp;amp;&amp;amp; itemIdx &amp;lt;= last &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;then&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (startI, endI) =&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; itemIdx = last &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;then&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;(sparse.RowPointers.[itemIdx], sparse.RowPointers.[itemIdx])&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;(sparse.RowPointers.[itemIdx], sparse.RowPointers.[itemIdx + 1] - 1)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;seq&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; { &lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;for&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; idx = startI &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;to&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; endI &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;do&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; productIdx = sparse.ColumnIndices.[idx] + offset&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; item = sparse.Values.[idx]&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (not (lookup.Contains(productIdx))) &amp;amp;&amp;amp; (item &amp;gt; 0.0) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;then&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; KeyValuePair(item, productIdx)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;|&amp;gt; queue.Merge)&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Return the queue&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;queue&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In the new version of the code The Values array provides access to the underlying non-empty values. The RowPointers array provides access to the value indexes where each row starts. Finally, the ColumnIndicies are the column indices corresponding to the values.&lt;/p&gt;  &lt;p&gt;Other than this change all other aspects of the library’s usage were effectively unchanged; including the MapReduce code (postings can be found &lt;a href="http://blogs.msdn.com/b/carlnol/archive/tags/recommendations/" target="_blank"&gt;here&lt;/a&gt;), as this uses a collection of Vector types. I did however update the job submission scripts.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10374926" width="1" height="1"&gt;</content><author><name>Carl Nolan</name><uri>http://blogs.msdn.com/carlnolan/ProfileUrlRedirect.ashx</uri></author><category term="F#" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/F_2300_/" /><category term="MapReduce" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/MapReduce/" /><category term=".Net" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/-Net/" /><category term=".Net Programming" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/-Net+Programming/" /><category term="PriorityQueue" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/PriorityQueue/" /><category term="Matrix" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Matrix/" /><category term="Recommendations" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Recommendations/" /><category term="Machine Learning" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Machine+Learning/" /><category term="Vector" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Vector/" /></entry><entry><title>Implementing a MapReduce Join with Hadoop and the .Net Framework</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/carlnol/archive/2012/11/13/implementing-a-mapreduce-join-with-hadoop-and-the-net-framework.aspx" /><id>http://blogs.msdn.com/b/carlnol/archive/2012/11/13/implementing-a-mapreduce-join-with-hadoop-and-the-net-framework.aspx</id><published>2012-11-13T20:46:10Z</published><updated>2012-11-13T20:46:10Z</updated><content type="html">&lt;p&gt;I have often been asked how does one implement a Join whilst writing MapReduce code. As such, I thought it would be useful to add an additional sample demonstrating how this is achieved. There are multiple mechanisms one can employ to perform a Join operation, and the one to be discussed will be a Reduce Side&lt;strong&gt; 1-to-many&lt;/strong&gt; join.&lt;/p&gt;  &lt;p&gt;As always this sample, amongst others, can be found in the “&lt;a href="http://code.msdn.microsoft.com/Framework-for-Composing-af656ef7"&gt;Generics based Framework for .Net Hadoop MapReduce Job Submission&lt;/a&gt;” code download; within the Samples folder.&lt;/p&gt;  &lt;h3&gt;Join Semantics&lt;/h3&gt;  &lt;p&gt;Say one wants to join two sets of data, A and B, via a common set attribute. Set A could be defined as a collection of tuples of the form (k&lt;sub&gt;i&lt;/sub&gt;, a&lt;sub&gt;i&lt;/sub&gt;, A&lt;sub&gt;i&lt;/sub&gt;), where &lt;em&gt;k&lt;/em&gt; represents the key value on which we want to do the join, &lt;em&gt;s&lt;/em&gt; the set item unique identifier, and S the other attributes. For this set each &lt;em&gt;k&lt;/em&gt; value would correspond to a unique value of &lt;em&gt;a&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;Set B would be similarly defined as a collection of tuples of the form (k&lt;sub&gt;i&lt;/sub&gt;, b&lt;sub&gt;x&lt;/sub&gt;, B&lt;sub&gt;x&lt;/sub&gt;). In this case each value of &lt;em&gt;k&lt;/em&gt; would equate to multiple values of &lt;em&gt;b&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;As an example, set A could be thus represented by an OrderHeader type and B the corresponding OrderDetail types. The &lt;em&gt;k&lt;/em&gt; and &lt;em&gt;a&lt;/em&gt; values in this case would represent the sales order identifier. The b value would represent the sales order detail identifier.&lt;/p&gt;  &lt;p&gt;The basic concept is that the MapReduce job will create a new set C, which would be defined by the tuple collection (k&lt;sub&gt;i&lt;/sub&gt;, a&lt;sub&gt;x&lt;/sub&gt;, b&lt;sub&gt;y&lt;/sub&gt;, A&lt;sub&gt;x&lt;/sub&gt;, B&lt;sub&gt;y&lt;/sub&gt;). For each key identifier &lt;em&gt;k&lt;/em&gt;, there would be a single value of &lt;em&gt;a&lt;/em&gt;, and multiple values for &lt;em&gt;b&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;(k&lt;sub&gt;64&lt;/sub&gt;, a&lt;sub&gt;52&lt;/sub&gt;, b&lt;sub&gt;106&lt;/sub&gt;, A&lt;sub&gt;52&lt;/sub&gt;, B&lt;sub&gt;106&lt;/sub&gt;)     &lt;br /&gt;(k&lt;sub&gt;64&lt;/sub&gt;, a&lt;sub&gt;52&lt;/sub&gt;, b&lt;sub&gt;121&lt;/sub&gt;, A&lt;sub&gt;52&lt;/sub&gt;, B&lt;sub&gt;121&lt;/sub&gt;)     &lt;br /&gt;…     &lt;br /&gt;(k&lt;sub&gt;64&lt;/sub&gt;, a&lt;sub&gt;52&lt;/sub&gt;, b&lt;sub&gt;234&lt;/sub&gt;, A&lt;sub&gt;52&lt;/sub&gt;, B&lt;sub&gt;234&lt;/sub&gt;)&lt;/p&gt;  &lt;p&gt;Furthering the sample this new set C could be represented by a new type being the aggregate of the OrderHeader and OrderDetail types; say OrderLine. The SalesOrderId would be the common key attribute.&lt;/p&gt;  &lt;p&gt;To perform the Reduce Side join the Mapper would read in the data representing both the sets of data. When processing set A data the emitted value would be (k&lt;sub&gt;i&lt;/sub&gt;, a&lt;sub&gt;x&lt;/sub&gt;, A&lt;sub&gt;x&lt;/sub&gt;, Ø, Ø), and for set B the value (k&lt;sub&gt;i&lt;/sub&gt;, Ø, Ø, b&lt;sub&gt;y&lt;/sub&gt;, B&lt;sub&gt;y&lt;/sub&gt;). In both cases the emitted key would be common key attribute value.&lt;/p&gt;  &lt;p&gt;The Reducer would receive the set values for each shared key attribute; namely a single (k&lt;sub&gt;i&lt;/sub&gt;, a&lt;sub&gt;x&lt;/sub&gt;, A&lt;sub&gt;x&lt;/sub&gt;, Ø, Ø) value, and multiple (k&lt;sub&gt;i&lt;/sub&gt;, Ø, Ø, b&lt;sub&gt;y&lt;/sub&gt;, B&lt;sub&gt;y&lt;/sub&gt;) values. It would then emit the full set of (k&lt;sub&gt;i&lt;/sub&gt;, a&lt;sub&gt;x&lt;/sub&gt;, b&lt;sub&gt;y&lt;/sub&gt;, A&lt;sub&gt;x&lt;/sub&gt;, B&lt;sub&gt;y&lt;/sub&gt;) values; for each key attribute.&lt;/p&gt;  As an example when processing orders the input data would be parsed into either an OrderHeader or OrderDetail object. In both cases the Mapper would emit an OrderLine item; with a null value for the missing data.&amp;#160; The Reducer would then read these values for a specific SalesOrderID key value and then emit the set of complete OrderLine values.   &lt;p&gt;So as an example, lets do a join between order header and detail information, from the SQL Server AdventureWorks sample database. The sample download also includes a BCP scripts to extract sales data from the sample database. For completeness I have also written the sample in both C# (with heavy use of LINQ) and F#.&lt;/p&gt;  &lt;h3&gt;Defining the Types&lt;/h3&gt;  &lt;p&gt;To start we need to define types that represent the sales header and detail information. These type definitions, listed below, are OrderHeader and OrderDetail. As mentioned we also need an aggregate type, called OrderLine, that aggregates both the header and detail types. &lt;/p&gt;  &lt;h5&gt;&lt;strong&gt;C# Classes&lt;/strong&gt;&lt;/h5&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5587b026-ac1b-4b76-9e1c-eb0b1a43e8af" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Order Header Information&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderHeader&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; SalesOrderID { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OrderDate { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ShipDate { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; CustomerID { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; SalesOrderNumber { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; PurchaseOrderNumber { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; AccountNumber { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Order Header Information&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderDetail&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; SalesOrderID { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; SalesOrderDetailID { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ProductID { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;decimal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OrderQty { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;decimal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; UnitPrice { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Order Line Information&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderHeader&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OrderHeader { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderDetail&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OrderDetail { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h5&gt;&lt;strong&gt;F# Records&lt;/strong&gt;&lt;/h5&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b57812ca-3a94-48be-ba21-54dc47cb7824" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#008000"&gt;/// Order Header Information&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OrderHeader = { SalesOrderID:int; OrderDate:DateTime; ShipDate:DateTime; CustomerID:int; SalesOrderNumber:string; PurchaseOrderNumber:string; AccountNumber:string }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#008000"&gt;/// Order Detail Information&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OrderDetail = { SalesOrderID:int; SalesOrderDetailID:int; ProductID:int; OrderQty:decimal; UnitPrice:decimal }&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#008000"&gt;/// Order Line Information&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OrderLine = { OrderHeader:OrderHeader; OrderDetail:OrderDetail }&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The OrderLine aggregated type is used as the output from the Mapper and the Reducer.&lt;/p&gt;  &lt;h3&gt;Mapper Processing&lt;/h3&gt;  &lt;p&gt;The purpose of the mapper is to read in both the header and detail data. For each data record the mapper outputs a value of an OrderLine instance, along with a key value of the SalesOrderID value. When processing a sales header data item an OrderLine is output with a null value for the OrderDetail; and of course vice-versa when processing a detail data item.&lt;/p&gt;  &lt;p&gt;The code for parsing the data items is as below. In this instance I have made the determination of the data item type by inspecting the second data value. In this case I am looking for an OrderDate; however one can adopt many different approaches based on the input data.&lt;/p&gt;  &lt;h5&gt;C# Mapper&lt;/h5&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8ab02eb7-30fa-4dee-b652-ccb2f2af5ff9" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Processes the Order Header and Detail files (In Memory)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderJoinMemoryMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;MapperBaseText&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt; Map(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; value)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; splits = value.Split(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;#39;&amp;#92;t&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; salesOrderID = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Int32&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[0]);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (splits[1].Contains(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;))&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderDate = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[1]);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; shipDate = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[2]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; customerID = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Int32&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[3]);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; salesOrderNumber = splits[4];&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; purchaseOrderNumber = splits[5];&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; accountNumber = splits[6];&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; header = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderHeader&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;SalesOrderID = salesOrderID,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;OrderDate = orderDate,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;ShipDate = shipDate,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;CustomerID = customerID,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;SalesOrderNumber = salesOrderNumber,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;PurchaseOrderNumber = purchaseOrderNumber,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;AccountNumber = accountNumber&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(splits[0], &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;() { OrderHeader = header, OrderDetail = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; });&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; salesOrderDetailID = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Int32&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[1]);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; productID = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Int32&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[2]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;decimal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderQty = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Decimal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[3]);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;decimal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; unitPrice = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Decimal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[4]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; detail = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderDetail&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;SalesOrderID = salesOrderID,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;SalesOrderDetailID = salesOrderDetailID,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;ProductID = productID,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;OrderQty = orderQty,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;UnitPrice = unitPrice&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(splits[0], &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;() { OrderHeader = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, OrderDetail = detail });&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h5&gt;F# Mapper&lt;/h5&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:87c99b1a-6474-409a-94cf-2529ec3c488a" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Processes the Order Header and Detail files (In Memory)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OrderJoinMemoryMapper() =&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;inherit&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; MapperBaseText&amp;lt;OrderLine&amp;gt;()&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Performs the split into the correct type&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (|Header|Detail|Unknown|) (value:string) =&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; splits = value.Split(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;#39;&amp;#92;t&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; salesOrderID = Int32.Parse(splits.[0])&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; splits.[1].Contains(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Processing a Header record&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderDate = DateTime.Parse(splits.[1])&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; shipDate = DateTime.Parse(splits.[2])&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; customerID = Int32.Parse(splits.[3])&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; salesOrderNumber = splits.[4]&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; purchaseOrderNumber = splits.[5]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; accountNumber = splits.[6]&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;Header (splits.[0], { OrderHeader.SalesOrderID = salesOrderID; OrderDate = orderDate; ShipDate = shipDate; CustomerID = customerID;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                    &lt;span style="background:#ffffff;color:#000000"&gt;SalesOrderNumber = salesOrderNumber; PurchaseOrderNumber = purchaseOrderNumber; AccountNumber = accountNumber })&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Processing a detail record&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; salesOrderDetailID = Int32.Parse(splits.[1])&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; productID = Int32.Parse(splits.[2])&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderQty = Decimal.Parse(splits.[3])&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; unitPrice = Decimal.Parse(splits.[4])&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;Detail (splits.[0], {OrderDetail.SalesOrderID = salesOrderID; SalesOrderDetailID = salesOrderDetailID; ProductID = productID;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                    &lt;span style="background:#ffffff;color:#000000"&gt;OrderQty = orderQty; UnitPrice = unitPrice })&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;with&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;| :? System.ArgumentException &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Unknown&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Map the data from input name/value to output name/value&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; self.Map (value:string) =&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;seq&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; {&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;match&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; value &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;with&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;| Header (key, header) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (key, { OrderLine.OrderHeader = header; OrderDetail = Unchecked.defaultof&amp;lt;OrderDetail&amp;gt; })&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;| Detail (key, detail) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (key, { OrderLine.OrderHeader = Unchecked.defaultof&amp;lt;OrderHeader&amp;gt;; OrderDetail = detail })&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;| Unknown &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ()&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Literally that is it for the Mapper. It determines the type of input line and emits an OrderLine item.&lt;/p&gt;  &lt;p&gt;As you can see the key is the SalesOrderID value. More on this later, when talking about a performance optimization.&lt;/p&gt;  &lt;h3&gt;Reducer Processing&lt;/h3&gt;  &lt;p&gt;The purpose of the Reducer is to locate the OrderHeader value for each SalesOrderID key value, and for each corresponding OrderDetail value output a complete OrderLine; consisting of the located header value and the detail values.&lt;/p&gt;  &lt;p&gt;In this version of the code, again shown below, use is made of a List of OrderDetail items. Once all the values have been read then the OrderLine sequence of values are returned.&lt;/p&gt;  &lt;h5&gt;C# Reducer&lt;/h5&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ef8bdc64-b563-405e-a85f-f8fd70e75c48" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Performs the combined data 1-many join (In Memory)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderJoinMemoryReducer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ReducerBase&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt; Reduce(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; key, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; values)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderHeader&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderHeader = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderDetails = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;List&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderDetail&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;();&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;foreach&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; line &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; values)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (line.OrderDetail != &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;orderDetails.Add(line.OrderDetail);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;orderHeader = line.OrderHeader;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (orderHeader != &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderDetails.Select(detail =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(key, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;() { OrderHeader = orderHeader, OrderDetail = detail }));&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Enumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Empty&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt;();&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h5&gt;F# Reducer&lt;/h5&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b6a4ebf2-a33f-473a-9899-9ad5942658eb" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Performs the combined data 1-many join (In Memory)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OrderJoinMemoryReducer() =&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;inherit&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ReducerBase&amp;lt;OrderLine, OrderLine&amp;gt;()&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; self.Reduce (key:string) (values:seq&amp;lt;OrderLine&amp;gt;) =&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderHeader = ref Unchecked.defaultof&amp;lt;OrderHeader&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; hasValue value = not (obj.ReferenceEquals (value, Unchecked.defaultof&amp;lt;_&amp;gt;))&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderDetails =&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;values&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;|&amp;gt; Seq.choose (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;fun&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; item &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (hasValue item.OrderDetail) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;Some(item.OrderDetail)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;orderHeader := item.OrderHeader&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;None)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (hasValue orderHeader) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;orderDetails&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;|&amp;gt; Seq.toList&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;|&amp;gt; Seq.map (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;fun&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; item &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;(key, { OrderLine.OrderHeader = !orderHeader; OrderDetail = item }))&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;Seq.empty&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;As you can see this code has a memory limitation. For each SalesOrderID value all the corresponding detail values need to be cached in memory, as no determination can be made as to when the header value is located. This may not be an issue with a small number of details associated to a header, but what about data where this number can be extremely large.&lt;/p&gt;  &lt;p&gt;This limitation however is easily overcome through the use of a secondary sort. Basically two key values are used to ensure the header value always arrives first within the Reducer.&lt;/p&gt;  &lt;h3&gt;Secondary Sort Optimization&lt;/h3&gt;  &lt;p&gt;When processing the order data for a particular key within the reducer, if one knows that the first value will always be the header data then this can be saved for detail data processing. Thus when reading the subsequent detail lines the aggregated OrderLine instance values can be emitted directly without the intermediate List processing step. This is where a secondary sort comes into play.&lt;/p&gt;  &lt;p&gt;If one uses two keys rather than one, it is possible to sort the data such that the first value, for each SalesOrderID, will be the header data. This can be achieved in our case by using a secondary sort key of the SalesOrderDetailID. For the header one can then just use a value of zero to ensure it is the first value; as all details items have a positive value. Of course, different approaches can be taken depending on the data domain.&lt;/p&gt;  &lt;p&gt;Although the data is sorted on two separate keys, the partitioning must be such that the data for each SalesOrderID is sent to a single Reducer; spanning multiple SalesOrderDetailID values.&lt;/p&gt;  &lt;p&gt;Using this approach here is the code for the modified Mapper logic:&lt;/p&gt;  &lt;h5&gt;C# Mapper&lt;/h5&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:35bb8c4c-c4dc-4348-98bb-a3bb7217f803" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Processes the Order Header and Detail files&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderJoinMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;MapperBaseText&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt; Map(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; value)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; splits = value.Split(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;#39;&amp;#92;t&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; salesOrderID = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Int32&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[0]);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (splits[1].Contains(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;))&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderDate = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[1]);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; shipDate = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[2]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; customerID = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Int32&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[3]);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; salesOrderNumber = splits[4];&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; purchaseOrderNumber = splits[5];&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; accountNumber = splits[6];&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; key = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Context&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.FormatKeys(splits[0], &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; header = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderHeader&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;SalesOrderID = salesOrderID,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;OrderDate = orderDate,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;ShipDate = shipDate,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;CustomerID = customerID,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;SalesOrderNumber = salesOrderNumber,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;PurchaseOrderNumber = purchaseOrderNumber,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;AccountNumber = accountNumber&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(key, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;() { OrderHeader = header, OrderDetail = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; });&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; salesOrderDetailID = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Int32&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[1]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; productID = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Int32&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[2]);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;decimal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderQty = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Decimal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[3]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;decimal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; unitPrice = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Decimal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(splits[4]);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; key = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Context&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.FormatKeys(splits[0], splits[1]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; detail = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderDetail&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;SalesOrderID = salesOrderID,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;SalesOrderDetailID = salesOrderDetailID,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;ProductID = productID,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;OrderQty = orderQty,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;UnitPrice = unitPrice&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(key, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;() { OrderHeader = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, OrderDetail = detail });&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h5&gt;F# Mapper&lt;/h5&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e43c7eea-1df9-43ba-bacf-2893554adb74" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Processes the Order Header and Detail files&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OrderJoinMapper() =&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;inherit&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; MapperBaseText&amp;lt;OrderLine&amp;gt;()&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Performs the split into the correct type&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (|Header|Detail|Unknown|) (value:string) =&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; splits = value.Split(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;#39;&amp;#92;t&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; salesOrderID = Int32.Parse(splits.[0])&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; splits.[1].Contains(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Processing a Header record&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderDate = DateTime.Parse(splits.[1])&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      ��         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; shipDate = DateTime.Parse(splits.[2])&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; customerID = Int32.Parse(splits.[3])&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; salesOrderNumber = splits.[4]&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; purchaseOrderNumber = splits.[5]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; accountNumber = splits.[6]&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; key = Context.FormatKeys(splits.[0], &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;Header (key, { OrderHeader.SalesOrderID = salesOrderID; OrderDate = orderDate; ShipDate = shipDate; CustomerID = customerID;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                    &lt;span style="background:#ffffff;color:#000000"&gt;SalesOrderNumber = salesOrderNumber; PurchaseOrderNumber = purchaseOrderNumber; AccountNumber = accountNumber })&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Processing a detail record&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; salesOrderDetailID = Int32.Parse(splits.[1])&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; productID = Int32.Parse(splits.[2])&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderQty = Decimal.Parse(splits.[3])&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; unitPrice = Decimal.Parse(splits.[4])&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; key = Context.FormatKeys(splits.[0], splits.[1])&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;Detail (key, {OrderDetail.SalesOrderID = salesOrderID; SalesOrderDetailID = salesOrderDetailID; ProductID = productID;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                    &lt;span style="background:#ffffff;color:#000000"&gt;OrderQty = orderQty; UnitPrice = unitPrice })&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;with&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;| :? System.ArgumentException &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Unknown&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Map the data from input name/value to output name/value&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; self.Map (value:string) =&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;seq&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; {&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;match&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; value &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;with&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;| Header (key, header) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (key, { OrderLine.OrderHeader = header; OrderDetail = Unchecked.defaultof&amp;lt;OrderDetail&amp;gt; })&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;| Detail (key, detail) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (key, { OrderLine.OrderHeader = Unchecked.defaultof&amp;lt;OrderHeader&amp;gt;; OrderDetail = detail })&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;| Unknown &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ()&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The multiple keys values are delimitated with a Tab value. &lt;/p&gt;  &lt;p&gt;The Reducer code then becomes a lot simpler as no List caching is involved; and where LINQ enables succinct C# code.&lt;/p&gt;  &lt;h5&gt;C# Reducer&lt;/h5&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e9f1c776-3e24-4199-a561-e355285953e3" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Performs the combined data 1-many join&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderJoinReducer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ReducerBase&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt; Reduce(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; key, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; values)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; salesOrderID = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Context&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.GetKeys(key)[0];&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderHeader&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderHeader = values.ElementAt(0).OrderHeader;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; values.Skip(1).Select(detail =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(salesOrderID, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderLine&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;() { OrderHeader = orderHeader, OrderDetail = detail.OrderDetail }));&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h5&gt;F# Reducer&lt;/h5&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:256f8fe2-7d40-487b-b84e-67559327f38f" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Performs the combined data 1-many join&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OrderJoinReducer() =&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;inherit&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ReducerBase&amp;lt;OrderLine, OrderLine&amp;gt;()&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; self.Reduce (key:string) (values:seq&amp;lt;OrderLine&amp;gt;) =&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; salesOrderID = Context.GetKeys(key).[0]&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;let&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderHeader = Seq.nth 0 values&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;values&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;|&amp;gt; Seq.skip 1&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;|&amp;gt; Seq.map (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;fun&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; item &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;(salesOrderID, { OrderLine.OrderHeader = orderHeader.OrderHeader; OrderDetail = item.OrderDetail }))&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;As you can see the code is probably simpler, especially when it comes to the Reducer, and is also more efficient than the In-Memory approach.&lt;/p&gt;  &lt;h3&gt;Submitting the Jobs&lt;/h3&gt;  &lt;p&gt;For the In-Memory code the job submission is quite simple:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Consolas"&gt;%BASEPATH%\MSDN.Hadoop.MapReduce\Release\MSDN.Hadoop.Submission.Console.exe      &lt;br /&gt;&amp;#160; -input &amp;quot;join/data&amp;quot;       &lt;br /&gt;&amp;#160; -output &amp;quot;join/order&amp;quot;       &lt;br /&gt;&amp;#160; -mapper &amp;quot;MSDN.Hadoop.MapReduceFSharp.OrderJoinMemoryMapper, MSDN.Hadoop.MapReduceFSharp&amp;quot;       &lt;br /&gt;&amp;#160; -reducer &amp;quot;MSDN.Hadoop.MapReduceFSharp.OrderJoinMemoryReducer, MSDN.Hadoop.MapReduceFSharp&amp;quot;       &lt;br /&gt;&amp;#160; -file &amp;quot;%BASEPATH%\MSDN.Hadoop.MapReduceFSharp\Release\MSDN.Hadoop.MapReduceFSharp.dll&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;However, for the optimized version one needs to accommodate the fact that the sorting takes place on two keys, and the data partitioning only on one. This is achieved by setting these exact options:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Consolas"&gt;%BASEPATH%\MSDN.Hadoop.MapReduce\Release\MSDN.Hadoop.Submission.Console.exe      &lt;br /&gt;&amp;#160; -input &amp;quot;join/data&amp;quot;       &lt;br /&gt;&amp;#160; -output &amp;quot;join/order&amp;quot;       &lt;br /&gt;&amp;#160; -mapper &amp;quot;MSDN.Hadoop.MapReduceFSharp.OrderJoinMapper, MSDN.Hadoop.MapReduceFSharp&amp;quot;       &lt;br /&gt;&amp;#160; -reducer &amp;quot;MSDN.Hadoop.MapReduceFSharp.OrderJoinReducer, MSDN.Hadoop.MapReduceFSharp&amp;quot;       &lt;br /&gt;&amp;#160; -file &amp;quot;%BASEPATH%\MSDN.Hadoop.MapReduceFSharp\Release\MSDN.Hadoop.MapReduceFSharp.dll&amp;quot;       &lt;br /&gt;&amp;#160; &lt;strong&gt;-numberKeys 2 -numberPartitionKeys 1&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The reason these options were added to version 1.0.0 of the code was to accommodate this exact type of processing.&lt;/p&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;To conclude here is some sample output from the join. &lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:95c52258-daae-4aa8-bd1a-3d25323e3b11" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;43667    {&amp;quot;OrderDetail&amp;quot;:{&amp;quot;OrderQty&amp;quot;:3,&amp;quot;ProductID&amp;quot;:710,&amp;quot;SalesOrderDetailID&amp;quot;:77,&amp;quot;SalesOrderID&amp;quot;:43667,&amp;quot;UnitPrice&amp;quot;:5.7000},&amp;quot;OrderHeader&amp;quot;:{&amp;quot;AccountNumber&amp;quot;:&amp;quot;10-4020-000646&amp;quot;,&amp;quot;CustomerID&amp;quot;:29974,&amp;quot;OrderDate&amp;quot;:&amp;quot;&amp;#92;/Date(1120172400000+0100)&amp;#92;/&amp;quot;,&amp;quot;PurchaseOrderNumber&amp;quot;:&amp;quot;PO15428132599&amp;quot;,&amp;quot;SalesOrderID&amp;quot;:43667,&amp;quot;SalesOrderNumber&amp;quot;:&amp;quot;SO43667&amp;quot;,&amp;quot;ShipDate&amp;quot;:&amp;quot;&amp;#92;/Date(1120777200000+0100)&amp;#92;/&amp;quot;}}&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;43667    {&amp;quot;OrderDetail&amp;quot;:{&amp;quot;OrderQty&amp;quot;:1,&amp;quot;ProductID&amp;quot;:773,&amp;quot;SalesOrderDetailID&amp;quot;:78,&amp;quot;SalesOrderID&amp;quot;:43667,&amp;quot;UnitPrice&amp;quot;:2039.9940},&amp;quot;OrderHeader&amp;quot;:{&amp;quot;AccountNumber&amp;quot;:&amp;quot;10-4020-000646&amp;quot;,&amp;quot;CustomerID&amp;quot;:29974,&amp;quot;OrderDate&amp;quot;:&amp;quot;&amp;#92;/Date(1120172400000+0100)&amp;#92;/&amp;quot;,&amp;quot;PurchaseOrderNumber&amp;quot;:&amp;quot;PO15428132599&amp;quot;,&amp;quot;SalesOrderID&amp;quot;:43667,&amp;quot;SalesOrderNumber&amp;quot;:&amp;quot;SO43667&amp;quot;,&amp;quot;ShipDate&amp;quot;:&amp;quot;&amp;#92;/Date(1120777200000+0100)&amp;#92;/&amp;quot;}}&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;43667    {&amp;quot;OrderDetail&amp;quot;:{&amp;quot;OrderQty&amp;quot;:1,&amp;quot;ProductID&amp;quot;:778,&amp;quot;SalesOrderDetailID&amp;quot;:79,&amp;quot;SalesOrderID&amp;quot;:43667,&amp;quot;UnitPrice&amp;quot;:2024.9940},&amp;quot;OrderHeader&amp;quot;:{&amp;quot;AccountNumber&amp;quot;:&amp;quot;10-4020-000646&amp;quot;,&amp;quot;CustomerID&amp;quot;:29974,&amp;quot;OrderDate&amp;quot;:&amp;quot;&amp;#92;/Date(1120172400000+0100)&amp;#92;/&amp;quot;,&amp;quot;PurchaseOrderNumber&amp;quot;:&amp;quot;PO15428132599&amp;quot;,&amp;quot;SalesOrderID&amp;quot;:43667,&amp;quot;SalesOrderNumber&amp;quot;:&amp;quot;SO43667&amp;quot;,&amp;quot;ShipDate&amp;quot;:&amp;quot;&amp;#92;/Date(1120777200000+0100)&amp;#92;/&amp;quot;}}&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;43667    {&amp;quot;OrderDetail&amp;quot;:{&amp;quot;OrderQty&amp;quot;:1,&amp;quot;ProductID&amp;quot;:775,&amp;quot;SalesOrderDetailID&amp;quot;:80,&amp;quot;SalesOrderID&amp;quot;:43667,&amp;quot;UnitPrice&amp;quot;:2024.9940},&amp;quot;OrderHeader&amp;quot;:{&amp;quot;AccountNumber&amp;quot;:&amp;quot;10-4020-000646&amp;quot;,&amp;quot;CustomerID&amp;quot;:29974,&amp;quot;OrderDate&amp;quot;:&amp;quot;&amp;#92;/Date(1120172400000+0100)&amp;#92;/&amp;quot;,&amp;quot;PurchaseOrderNumber&amp;quot;:&amp;quot;PO15428132599&amp;quot;,&amp;quot;SalesOrderID&amp;quot;:43667,&amp;quot;SalesOrderNumber&amp;quot;:&amp;quot;SO43667&amp;quot;,&amp;quot;ShipDate&amp;quot;:&amp;quot;&amp;#92;/Date(1120777200000+0100)&amp;#92;/&amp;quot;}}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Utilizing the output is merely a case of serializing the data back into the OrderLine type.&lt;/p&gt;  &lt;p&gt;Hopefully I have demonstrated that MapReduce joins are not that difficult to perform. With a little thought around the types, the code is not much more than data parsing.&lt;/p&gt;  &lt;p&gt;A word of caution, compared to standard database joins, MapReduce joins are slow. If you can join the data before running MapReduce processing then this should be your preferred approach.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10368232" width="1" height="1"&gt;</content><author><name>Carl Nolan</name><uri>http://blogs.msdn.com/carlnolan/ProfileUrlRedirect.ashx</uri></author><category term="F#" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/F_2300_/" /><category term="Sorting" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Sorting/" /><category term="C#" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/C_2300_/" /><category term="Hadoop Streaming" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop+Streaming/" /><category term="Hadoop" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop/" /><category term="MapReduce" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/MapReduce/" /><category term=".Net Programming" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/-Net+Programming/" /><category term="Hadoop.Net" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop-Net/" /><category term="Partitioning" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Partitioning/" /><category term="Joins" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Joins/" /></entry><entry><title>Framework for .Net Hadoop MapReduce Job Submission V1.0 Release</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/carlnol/archive/2012/10/10/framework-for-net-hadoop-mapreduce-job-submission-v1-0-release.aspx" /><id>http://blogs.msdn.com/b/carlnol/archive/2012/10/10/framework-for-net-hadoop-mapreduce-job-submission-v1-0-release.aspx</id><published>2012-10-10T10:31:00Z</published><updated>2012-10-10T10:31:00Z</updated><content type="html">&lt;p&gt;It has been a few months since I have made a change to the &amp;ldquo;&lt;a href="http://code.msdn.microsoft.com/Framework-for-Composing-af656ef7"&gt;Generics based Framework for .Net Hadoop MapReduce Job Submission&lt;/a&gt;&amp;rdquo; code. However I was going to put together a sample for a Reduce side join and came across a issue around the usage of partitioners. As such I decided to add support for custom&amp;nbsp; partitioners and comparators, before stamping the release as a version 1.0.&lt;/p&gt;
&lt;p&gt;The submission options to be added will be -&lt;em&gt;numberPartitionKeys&lt;/em&gt; (for partitioning the data) and -&lt;em&gt;comparatorOption&lt;/em&gt; (for sorting). Before talking about these options lets cover a little of the &lt;a title="Hadoop Streaming" href="http://hadoop.apache.org/docs/r1.0.3/streaming.html" target="_blank"&gt;Hadoop Streaming Documentation&lt;/a&gt;.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;A Useful Partitioner Class&lt;/h3&gt;
&lt;p&gt;Hadoop has a library class, &lt;a href="http://hadoop.apache.org/docs/r0.19.2/api/org/apache/hadoop/mapred/lib/KeyFieldBasedPartitioner.html"&gt;KeyFieldBasedPartitioner&lt;/a&gt;, that allows the MapReduce framework to partition the map outputs on key segments rather than the whole key. Consider the following job submission options:&lt;/p&gt;
&lt;pre&gt;    -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner 
    -Dstream.num.map.output.key.fields=4 
    -Dmapred.text.key.partitioner.options=-k1,2
&lt;/pre&gt;
&lt;p&gt;The &lt;em&gt;-Dstream.num.map.output.key.fields=4&lt;/em&gt; option specifies that the map output keys will have 4 fields. In this case the the &lt;em&gt;-Dmapred.text.key.partitioner.options=-k1,2&lt;/em&gt; option tells the MapReduce framework to partition the map outputs by the first two fields of the key; rather than the full set of four keys.This guarantees that all the key/value pairs with the same first two fields in the keys will be partitioned to the same reducer.&lt;/p&gt;
&lt;p&gt;To simplify this specification the submission framework supports the following command line options:&lt;/p&gt;
&lt;pre&gt;    -numberKeys 4
    -numberPartitionKeys 2
&lt;/pre&gt;
&lt;p&gt;When writing Streaming applications one normally has to do the partition processing in the Reducer. However with these options the framework will correctly send the appropriate data to the Reducer. This was the biggest change that needed to be made to the Framework.&lt;/p&gt;
&lt;p&gt;This partition processing is important for handling Reduce side joins; the topic of my next blog post.&lt;/p&gt;
&lt;h3&gt;A Useful Comparator Class&lt;/h3&gt;
&lt;p&gt;Hadoop also has a library class, &lt;a href="http://hadoop.apache.org/docs/r0.19.2/api/org/apache/hadoop/mapred/lib/KeyFieldBasedComparator.html"&gt;KeyFieldBasedComparator&lt;/a&gt;, that provides sorting the key data. Consider the following job submission options:&lt;/p&gt;
&lt;pre&gt;    -D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator
    -D mapred.text.key.comparator.options=-k2,2nr
&lt;/pre&gt;
&lt;p&gt;Here the MapReduce framework will sort the outputs on the second key field; the &lt;em&gt;-Dmapred.text.key.comparator.options=-k2,2nr&lt;/em&gt; option. The &lt;em&gt;-n&lt;/em&gt; specifies that the sorting is numerical and the &lt;em&gt;-r&lt;/em&gt; specifies that the result should be reversed. The sort options are similar to a Unix sort, but here are some simple examples:&lt;/p&gt;
&lt;p&gt;Reverse ordering: &lt;code&gt;&lt;em&gt;-Dmapred.text.key.comparator.options=-r&lt;/em&gt; &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Numeric ordering: &lt;code&gt;&lt;em&gt;-Dmapred.text.key.comparator.options=-n &lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Specific sort specification:&lt;strong&gt; &lt;/strong&gt;&lt;code&gt;&lt;em&gt;-Dmapred.text.key.comparator.options=-kx,y&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For the general sort specification the -k flag is used, which allows you to specify the sorting key using the the x, y values; as in the sample above.&lt;/p&gt;
&lt;p&gt;To simplify this specification the submission framework supports the following command line option:&lt;/p&gt;
&lt;pre&gt;    -comparatorOption &amp;rdquo;-k2,2nr&amp;rdquo;
&lt;/pre&gt;
&lt;p&gt;The framework then takes care of setting the appropriate job configuration values.&lt;/p&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;Although one could define the Partitioner and Comparator options using the job configuration parameters hopefully these new options make the process a lot simpler. In the case of the Partitioner options it also allows the framework to easily identity the difference in the number of sorting and partitioner keys. This allows the correct data to be sent to each Reducer.&lt;/p&gt;
&lt;p&gt;As mentioned, using these options, in my next post I will cover how to use the Framework for doing a Reduce side join.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10358206" width="1" height="1"&gt;</content><author><name>Carl Nolan</name><uri>http://blogs.msdn.com/carlnolan/ProfileUrlRedirect.ashx</uri></author><category term="Sorting" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Sorting/" /><category term="Hadoop Streaming" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop+Streaming/" /><category term="Hadoop" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop/" /><category term=".Net Programming" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/-Net+Programming/" /><category term="Hadoop.Net" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop-Net/" /><category term="Partitioning" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Partitioning/" /></entry><entry><title>Execution Time Based Heuristic Custom Task Scheduler</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/carlnol/archive/2012/10/02/execution-time-based-heuristic-custom-task-scheduler.aspx" /><id>http://blogs.msdn.com/b/carlnol/archive/2012/10/02/execution-time-based-heuristic-custom-task-scheduler.aspx</id><published>2012-10-02T18:36:01Z</published><updated>2012-10-02T18:36:01Z</updated><content type="html">&lt;p&gt;If you follow the samples for &lt;a href="http://code.msdn.microsoft.com/ParExtSamples" target="_blank"&gt;Parallel Programming with the .Net Framework&lt;/a&gt;, you may have come across the &lt;a href="http://blogs.msdn.com/b/pfxteam/archive/2010/04/04/9990342.aspx" target="_blank"&gt;ParallelExtensionsExtras&lt;/a&gt; and the &lt;a href="http://blogs.msdn.com/b/pfxteam/archive/2010/04/09/9990424.aspx" target="_blank"&gt;Additional TaskSchedulers&lt;/a&gt;. Although these samples cover a broad set of requirements I recently came across another that could be satisfied with the creation of a new custom task scheduler.&lt;/p&gt;  &lt;p&gt;In the current samples there is a custom task scheduler that supports a Maximum Degree of Parallelism (MDOP). However, what if one wanted to adjust the MDOP based on the task execution times.&lt;/p&gt;  &lt;p&gt;As an example consider calling a web service, or performing any data processing, from a message queue. I recently came across this requirement, where if the response times drop then the MDOP also needed to drop. One could take the approach of a service that manages its threads but a custom task scheduler enables a far greater set of usage scenarios.&lt;/p&gt;  &lt;p&gt;The full code can be located here: &lt;a title="Execution Time Based Heuristic Custom Task Scheduler" href="http://code.msdn.microsoft.com/Execution-Time-Based-dd4dbdb6" target="_blank"&gt;Execution Time Based Heuristic Custom Task Scheduler&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;LimitedConcurrencyLevelTaskScheduler Class&lt;/h3&gt;  &lt;p&gt;As a starting point here is the code from the &lt;a href="http://blogs.msdn.com/b/pfxteam/" target="_blank"&gt;PfX Team&lt;/a&gt; covering a custom task scheduler that allows one to specify a fixed MDOP:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:744b92bd-477b-445b-835e-8f53a84d50ee" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 3em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Collections.Generic;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Linq;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Threading;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Threading.Tasks;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;namespace&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; MSDN.Schedulers&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Provides a task scheduler that ensures a maximum concurrency level while running on top of the ThreadPool.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;sealed&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;LimitedConcurrencyLevelTaskScheduler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TaskScheduler&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Values defining the current state of the scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;struct&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ExecutionState&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Current level of concurrency.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; CurrentConcurrency { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;internal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Current count of awaiting task.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; AwaitingTasks { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;internal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Whether the current thread is processing work items.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ThreadStatic&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; CurrentThreadIsProcessingItems;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The list of tasks to be executed.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;readonly&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;LinkedList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; tasks = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;LinkedList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(); &lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// protected by lock(tasks)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The maximum concurrency level allowed by this scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;readonly&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; maxDegreeOfParallelism;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Whether the scheduler is currently processing work items.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; delegatesQueuedOrRunning = 0; &lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// protected by lock(_tasks)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Initializes an instance of the LimitedConcurrencyLevelTaskScheduler class with the specified degree of parallelism.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;maxDegreeOfParallelism&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The maximum degree of parallelism provided by this scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; LimitedConcurrencyLevelTaskScheduler(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; maxDegreeOfParallelism)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (maxDegreeOfParallelism &amp;lt; 1) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ArgumentOutOfRangeException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;maxDegreeOfParallelism&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.maxDegreeOfParallelism = maxDegreeOfParallelism;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Queues a task to the scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;task&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The task to be queued.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;protected&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; QueueTask(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; task)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Add the task to the list of tasks to be processed.  If there aren&amp;#39;t enough&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// delegates currently queued or running to process tasks, schedule another.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;lock&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.AddLast(task);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.delegatesQueuedOrRunning &amp;lt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.maxDegreeOfParallelism)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;++&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.delegatesQueuedOrRunning;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;NotifyThreadPoolOfPendingWork();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Informs the ThreadPool that there&amp;#39;s work to be executed for this scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; NotifyThreadPoolOfPendingWork()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ThreadPool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.UnsafeQueueUserWorkItem(_ =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Note that the current thread is now processing work items.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// This is necessary to enable inlining of tasks into this thread.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;CurrentThreadIsProcessingItems = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Process all available items in the queue.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;while&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; item;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;lock&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// When there are no more items to be processed,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// note that we&amp;#39;re done processing, and get out.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.Count == 0)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                &lt;span style="background:#ffffff;color:#000000"&gt;--&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.delegatesQueuedOrRunning;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;break&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Get the next item from the queue&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;item = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.First.Value;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.RemoveFirst();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Execute the task we pulled out of the queue&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;base&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.TryExecuteTask(item);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// We&amp;#39;re done processing items on the current thread&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;finally&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;CurrentThreadIsProcessingItems = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Attempts to execute the specified task on the current thread.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;task&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The task to be executed.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;taskWasPreviouslyQueued&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Indicator for whether the task was previously dequeued.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Whether the task could be executed on the current thread.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;protected&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; TryExecuteTaskInline(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; task, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; taskWasPreviouslyQueued)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// If this thread isn&amp;#39;t already processing a task, we don&amp;#39;t support inlining&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (!CurrentThreadIsProcessingItems) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// If the task was previously queued, remove it from the queue&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (taskWasPreviouslyQueued) TryDequeue(task);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Try to run the task.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;base&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.TryExecuteTask(task);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Attempts to remove a previously scheduled task from the scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;task&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The task to be removed.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Whether the task could be found and removed.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;protected&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; TryDequeue(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; task)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;lock&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.Remove(task);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Gets an enumerable of the tasks currently scheduled on this scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;An enumerable of the tasks currently scheduled.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;protected&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; GetScheduledTasks()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; lockTaken = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Monitor&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.TryEnter(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;ref&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; lockTaken);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (lockTaken) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.ToArray();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;NotSupportedException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;finally&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (lockTaken) &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Monitor&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Exit(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Gets the maximum concurrency level supported by this scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; MaximumConcurrencyLevel&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.maxDegreeOfParallelism;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Gets the current Execution State of the scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ExecutionState&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; SchedulerExecutionState&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ExecutionState&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; state = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ExecutionState&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;state.CurrentConcurrency = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.delegatesQueuedOrRunning;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;state.AwaitingTasks = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.Count;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; state;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Gets the current Processing state of the scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; IsProcessing&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.Count &amp;gt; 0 || &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.delegatesQueuedOrRunning &amp;gt; 0);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;To use the task scheduler one just has to create a task scheduler instance, with the required MDOP, and then create a Factory with the newly created scheduler:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d6828e77-90e4-4a18-87d5-411d3bda1b97" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;LimitedConcurrencyLevelTaskScheduler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; lclts = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;LimitedConcurrencyLevelTaskScheduler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(5);&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TaskFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; factory = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TaskFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(lclts);&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;factory.StartNew(() =&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;for&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; i = 0; i &amp;lt; 10; i++)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;{0} on thread {1}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, i, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.CurrentThread.ManagedThreadId);&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Alternatively to use the scheduler in Parallel loops, one will again create the task scheduler and use this when defining the ParallelOptions class for the parallel loop:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:967cdb16-f70b-455e-960e-84235a6364c3" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;LimitedConcurrencyLevelTaskScheduler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; lclts = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;LimitedConcurrencyLevelTaskScheduler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(5);&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ParallelOptions&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; options = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ParallelOptions&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;();&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;options.TaskScheduler = lclts;&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Parallel&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.For(&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;0,&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;50,&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;options,&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;(i) =&amp;gt;&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{                        &lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Sleep(100);&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Finish Thread={0}, i={1}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.CurrentThread.ManagedThreadId, i);&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;All easy stuff. So onto the new task scheduler.&lt;/p&gt;  &lt;h3&gt;ResponseLimitedConcurrencyTaskScheduler Class&lt;/h3&gt;  &lt;p&gt;In meeting the requirement to vary the MDOP based on execution times there are three main differences one needs to accommodate. Firstly, one needs a function that can be used for determining the MDOP based on average task execution times. Secondly, one needs to record the actual task execution times in such a manner that the average can be determined and passed to the MDOP calculator function. Lastly, the MDOP needs to be re-evaluated, and the number of executing threads adjusted accordingly.&lt;/p&gt;  &lt;p&gt;To support the requirement for determining the MDOP the scheduler class constructor now supports the following prototype:&lt;/p&gt;  &lt;pre&gt;public ResponseLimitedConcurrencyTaskScheduler(Func&amp;lt;int, int&amp;gt; funcMdop,&lt;br /&gt;    ResponseLimitedConcurrencyTaskConfiguration configuration)&lt;/pre&gt;

&lt;p&gt;This MDOP function is designed to accept an average execution time and return the desired MDOP. To calculate the average execution times a ConcurrentStack&amp;lt;int&amp;gt; is used to record the task execution times. On a timed schedule the top configured items from the stack are averaged, with this value being used in the MDOP calculation.&lt;/p&gt;
 

&lt;p&gt;Once the MDOP has been calculated it is used in the NotifyThreadPoolOfPendingWork() call to ensure the correct MDOP is used when processing threads.&lt;/p&gt;

&lt;p&gt;So without further adieu here is the full code listing for the scheduler:&lt;/p&gt;

&lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8e9500b6-aabc-4458-a8b8-9af1a625d5a4" class="wlWriterEditableSmartContent"&gt;
&lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt;
&lt;ol start="1" style="background: #ffffff; margin: 0 0 0 3em; padding: 0 0 0 5px; white-space: nowrap"&gt;
&lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;namespace&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; MSDN.Schedulers&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Collections.Concurrent;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Collections.Generic;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Diagnostics;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Linq;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Threading;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Threading.Tasks;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Provides a task scheduler that ensures a maximum concurrency level while running on top of the ThreadPool.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;sealed&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyTaskScheduler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TaskScheduler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IDisposable&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Values defining the current state of the scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;struct&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ExecutionState&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Gets the current Max Degree of Parallelism.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; MaxDegreeOfParallelism { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;internal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Gets the current level of concurrency.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; CurrentConcurrency { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;internal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Gets the current count of awaiting task.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; AwaitingTasks { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;internal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Gets the last sampled average of the execution times.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; LastSampledAverage { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;internal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Whether the current thread is processing work items.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ThreadStatic&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;]&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; CurrentThreadIsProcessingItems;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Scheduler running configuration.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;readonly&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyTaskConfiguration&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; configuration;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The list of tasks to be executed.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;readonly&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;LinkedList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; tasks = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;LinkedList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(); &lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// protected by lock(_tasks)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The maximum concurrency level allowed by this scheduler for the current response times.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;volatile&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; maxDegreeOfParallelism;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Last sampled average of the execution times.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;volatile&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; lastSampledAverage;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Whether the scheduler is currently processing work items.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; delegatesQueuedOrRunning = 0; &lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// protected by lock(_tasks)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Stack for holding execution times for calculating MDOP &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConcurrentStack&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; timings = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConcurrentStack&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;();&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Object to ensure MDOP is only set on a single thread.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; timingsSync = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;();&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Function determining the MDOP, where a zero average gives the starting MDOP.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Func&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; funcMdop;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The timer for refreshing the scheduler MDOP.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Timer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; refreshTimer;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Indicator for whether Dispose has been called.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; disposed = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Initializes a new instance of the ResponseLimitedConcurrencyTaskScheduler class with the specified MDOP function. &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;maxDegreeOfParallelism&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The maximum degree of parallelism function provider for this scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;configuration&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Scheduler configuration.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ResponseLimitedConcurrencyTaskScheduler(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Func&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; funcMdop, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyTaskConfiguration&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; configuration)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Finally ensure zero average gives a starting MDOP&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (funcMdop(0) &amp;lt; 0) { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ArgumentOutOfRangeException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;funcMdop&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Calculated Zero Max Degree of Parallelism cannot be negative.&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;); }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.funcMdop = funcMdop;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.configuration = configuration;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Get the default MDOP&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; mdop = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.funcMdop(0);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.maxDegreeOfParallelism = mdop == 0 ? &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.configuration.DefaultDegreeOfParallelism : mdop;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.lastSampledAverage = 0;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Setup the refresh of the MDOP&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; rate = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.configuration.SamplingRateMilliseconds;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.refreshTimer = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Timer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(state =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.SetMdop(), &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, rate + 1000, rate);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Initializes a new instance of the ResponseLimitedConcurrencyTaskScheduler class with the specified MDOP function.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;maxDegreeOfParallelism&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The maximum degree of parallelism function provider for this scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ResponseLimitedConcurrencyTaskScheduler(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Func&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; funcMdop)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(funcMdop, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyTaskConfiguration&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;())&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Define the MDOP based on the current state of the execution times. &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; SetMdop()&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.timings != &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.timings.Count &amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.configuration.MinimumSampleCount)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;lock&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.timingsSync)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.timings != &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.timings.Count &amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.configuration.MinimumSampleCount)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;[] latestTimes = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.configuration.AverageSampleCount];&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; count = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.timings.TryPopRange(latestTimes);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (count &amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.configuration.MinimumSampleCount)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.timings.Clear();&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; average = (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)latestTimes.Take(count).Average();&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; mdop = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.funcMdop(average);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.lastSampledAverage = average;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (mdop &amp;gt; 0) { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.maxDegreeOfParallelism = mdop &amp;lt;= 0 ? &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.configuration.DefaultDegreeOfParallelism : mdop; }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Attempts to execute the specified task recording execution time.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;task&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The task to be executed.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Whether the task could be executed on the current thread.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; TryExecuteTaskInternal(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; task)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Stopwatch&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; sw = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Stopwatch&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.StartNew();&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; result = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;base&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.TryExecuteTask(task);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;sw.Stop();&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TimeSpan&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; timing = sw.Elapsed;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Ensure queue is not growing too much before adding timing&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.timings.Count &amp;lt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.configuration.MaximumSampleCount) { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.timings.Push((&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)timing.TotalMilliseconds); }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; result;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Queues a task to the scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;task&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The task to be queued.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;protected&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; QueueTask(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; task)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Add the task to the list of tasks to be processed.  If there aren&amp;#39;t enough&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// delegates currently queued or running to process tasks, schedule another.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;lock&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.AddLast(task);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.delegatesQueuedOrRunning &amp;lt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.maxDegreeOfParallelism)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;++&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.delegatesQueuedOrRunning;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.NotifyThreadPoolOfPendingWork();&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Informs the ThreadPool that there&amp;#39;s work to be executed for this scheduler. &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; NotifyThreadPoolOfPendingWork()&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ThreadPool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.UnsafeQueueUserWorkItem(_ =&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Note that the current thread is now processing work items.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// This is necessary to enable inlining of tasks into this thread.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;CurrentThreadIsProcessingItems = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;try&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Process all available items in the queue.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;while&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; item;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;lock&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// When there are no more items to be processed,&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// or if running with too much concurrency,&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// note that we&amp;#39;re done processing, and get out.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.Count == 0 || &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.delegatesQueuedOrRunning &amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.maxDegreeOfParallelism)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                                &lt;span style="background:#ffffff;color:#000000"&gt;--&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.delegatesQueuedOrRunning;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;break&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Get the next item from the queue&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;item = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.First.Value;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.RemoveFirst();&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Execute the task we pulled out of the queue&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.TryExecuteTaskInternal(item);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// We&amp;#39;re done processing items on the current thread&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;finally&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;CurrentThreadIsProcessingItems = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Attempts to execute the specified task on the current thread.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;task&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The task to be executed.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;taskWasPreviouslyQueued&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Indicator for whether the task was previously dequeued.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Whether the task could be executed on the current thread.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;protected&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; TryExecuteTaskInline(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; task, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; taskWasPreviouslyQueued)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// If this thread isn&amp;#39;t already processing a task, we don&amp;#39;t support inlining&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (!CurrentThreadIsProcessingItems) { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// If the task was previously queued, remove it from the queue&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (taskWasPreviouslyQueued) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.TryDequeue(task);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Try to run the task.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.TryExecuteTaskInternal(task);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Attempts to remove a previously scheduled task from the scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;task&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The task to be removed.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Whether the task could be found and removed.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;protected&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; TryDequeue(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; task)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;lock&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.Remove(task);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Gets the maximum concurrency level supported by this scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; MaximumConcurrencyLevel&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.maxDegreeOfParallelism;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Gets an enumerable of the tasks currently scheduled on this scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;An enumerable of the tasks currently scheduled.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;protected&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; GetScheduledTasks()&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; lockTaken = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;try&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Monitor&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.TryEnter(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;ref&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; lockTaken);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (lockTaken)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.ToArray();&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;NotSupportedException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;();&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;finally&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (lockTaken) { &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Monitor&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Exit(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks); }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Gets the current Execution State of the scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ExecutionState&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; SchedulerExecutionState&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ExecutionState&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; state = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ExecutionState&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;();&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;state.LastSampledAverage = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.lastSampledAverage;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;state.MaxDegreeOfParallelism = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.maxDegreeOfParallelism;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;state.CurrentConcurrency = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.delegatesQueuedOrRunning;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;state.AwaitingTasks = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.Count;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; state;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Gets the current Configuration of the scheduler.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyTaskConfiguration&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; SchedulerTaskConfiguration&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.configuration;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Gets a value indicating whether the scheduler is processing.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; IsProcessing&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.tasks.Count &amp;gt; 0 || &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.delegatesQueuedOrRunning &amp;gt; 0;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Method to control the disposing of resources. &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;disposing&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Indicator for whether Dispose has been called directly.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Dispose(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; disposing)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (!&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.disposed)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (disposing)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.refreshTimer != &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.refreshTimer.Dispose();&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Indicate that the instance has been disposed.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.refreshTimer = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.disposed = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;IDisposable Dispose method.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Dispose()&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Dispose(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;GC&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.SuppressFinalize(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;To use the task scheduler one just has to create an instance, with the required MDOP function, and then as before create a Factory with the newly created scheduler:&lt;/p&gt;

&lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2faf788c-c351-4d38-8791-0acd90cd0cf5" class="wlWriterEditableSmartContent"&gt;
&lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;List&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyStepDefinition&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;();&lt;/span&gt;&lt;br&gt;
&lt;span style="background:#ffffff;color:#000000"&gt;config.Add(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyStepDefinition&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(5, 500));&lt;/span&gt;&lt;br&gt;
&lt;span style="background:#ffffff;color:#000000"&gt;config.Add(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyStepDefinition&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(3, 5000));&lt;/span&gt;&lt;br&gt;
&lt;span style="background:#ffffff;color:#000000"&gt;config.Add(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyStepDefinition&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(2, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Int32&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.MaxValue));&lt;/span&gt;&lt;br&gt;
&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Func&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; mdopFunc = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyFunctionFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.StepDecrement(config);&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyTaskScheduler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; rlcts = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyTaskScheduler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(mdopFunc);&lt;/span&gt;&lt;br&gt;
&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TaskFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; factory = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TaskFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(rlcts);&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style="background:#ffffff;color:#000000"&gt;factory.StartNew(() =&amp;gt;&lt;/span&gt;&lt;br&gt;
    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;
        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;for&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; i = 0; i &amp;lt; 10; i++)&lt;/span&gt;&lt;br&gt;
        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;
            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;{0} on thread {1}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, i, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.CurrentThread.ManagedThreadId);&lt;/span&gt;&lt;br&gt;
        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;
    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The only difference in this code is the construction of the MDOP function. To assist in creating this function the code comes with a few starters for 10. Firstly a step up and step down function, and secondly a linearly increasing and decreasing function. The step up and down functions takes a series of steps definitions outlining the step changes in MDOP. The linear increasing and decreasing functions take an upper and lower limit with a rate of change. &lt;/p&gt;

&lt;p&gt;There is one final item needed to meet the requirements that initially drove the custom task scheduler solution. How do you use the scheduler to process a queue of actions?&lt;/p&gt;

&lt;h3&gt;ResponseLimitedConcurrencyActionLoader Class&lt;/h3&gt;

&lt;p&gt;The downloadable code also contains a class that can be used to ensure the task scheduler instance always has an active processing queue of a specified Action:&lt;/p&gt;

&lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d1f1cffb-631e-4003-8748-ca6fdab71453" class="wlWriterEditableSmartContent"&gt;
&lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt;
&lt;ol start="1" style="background: #ffffff; margin: 0 0 0 3em; padding: 0 0 0 5px; white-space: nowrap"&gt;
&lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;namespace&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; MSDN.Schedulers&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Collections.Concurrent;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Collections.Generic;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Diagnostics;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Linq;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Threading;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; System.Threading.Tasks;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;A class to load a ResponseLimitedConcurrencyTaskScheduler with a single Action.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyActionLoader&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Indicator for whether to continue loading.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;volatile&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; continueProcessing = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The ResponseLimitedConcurrencyTaskScheduler reference.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyTaskScheduler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; scheduler;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The factory to be used for loading the action.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TaskFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; factory;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The Task used to load the data on a background thread.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; loaderTask;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The interval (in milliseconds) for which to review the outstanding tasks.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; baseInterval;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Initializes a new instance of the ResponseLimitedConcurrencyActionLoader class.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;scheduler&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The scheduler to load.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;interval&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The interval (in milliseconds) for which to perform a load check.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ResponseLimitedConcurrencyActionLoader(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyTaskScheduler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; scheduler, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; interval)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.scheduler = scheduler;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.factory = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TaskFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(scheduler);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.baseInterval = interval;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Initializes a new instance of the ResponseLimitedConcurrencyActionLoader class.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;scheduler&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The scheduler to load.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;interval&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The interval (in milliseconds) for which to perform a load check.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ResponseLimitedConcurrencyActionLoader(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyTaskScheduler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; scheduler)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(scheduler, 1000)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Indicators whether the scheduler or loader is currently busy.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; IsProcessing()&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.continueProcessing || &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.scheduler.IsProcessing;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Performs a load of the specified action until stop is called.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The action to execute.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Start(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Action&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; action)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Ensure loading is currently not active&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.IsProcessing()) { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;InvalidOperationException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Loader is currently active.&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;); }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Note now running&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.continueProcessing = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Define base configuration values&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; configuration = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.scheduler.SchedulerTaskConfiguration;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; minSampleRate = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Math&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Min(configuration.MinimumSampleCount * 3, configuration.AverageSampleCount * 2);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; interval = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Math&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Min(configuration.SamplingRateMilliseconds, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.baseInterval);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Load actions into scheduler until processing needs to stop&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.loaderTask = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Factory.StartNew(() =&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;while&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.continueProcessing)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Calculate tasks that should be pending&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; actualNeeded;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.scheduler.SchedulerExecutionState.LastSampledAverage == 0)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; rate = ((&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.scheduler.SchedulerExecutionState.MaxDegreeOfParallelism * 1000.0) / (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.scheduler.SchedulerExecutionState.LastSampledAverage;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; minNeeded = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Math&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Max((&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)((rate * (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)interval * 2.0) / 1000.0), minSampleRate);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;actualNeeded = minNeeded - &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.scheduler.SchedulerExecutionState.AwaitingTasks;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;actualNeeded = minSampleRate;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Load any needed tasks&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (actualNeeded &amp;gt; 0)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;for&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; idx = 0; idx &amp;lt; actualNeeded; idx++)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                                &lt;span style="background:#ffffff;color:#000000"&gt;factory.StartNew(action);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Wait for inteval before looping back around&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Sleep(interval);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;});&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Tell the loader to stop processing.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Stop()&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.continueProcessing = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.loaderTask != &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;) { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.loaderTask.Wait(); }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Tell the loader to stop processing and block until all actions complete.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; StopAndWait()&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Stop();&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;while&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.scheduler.IsProcessing) { &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Sleep(250); }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;If needed this class can be used to construct a Windows Service that processes items from a queue, and where the MDOP of the scheduler varies based on the workload. It is for this reason the code contains Start() and Stop() function calls. To use the Action Loader one just has to provide the necessary Action and Scheduler to the class instance:&lt;/p&gt;

&lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:22db13fd-6477-4bff-8a18-77dd5d50d40f" class="wlWriterEditableSmartContent"&gt;
&lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Func&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; funcMdop = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyFunctionFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.LinearDecreasing(5, 1, 2);&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyTaskScheduler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; rlcts = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyTaskScheduler&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(funcMdop);&lt;/span&gt;&lt;br&gt;
&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyActionLoader&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; loader = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResponseLimitedConcurrencyActionLoader&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(rlcts);&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Action&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; action = () =&amp;gt;&lt;/span&gt;&lt;br&gt;
        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;
            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Sleep(10);&lt;/span&gt;&lt;br&gt;
            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Finish Thread={0}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.CurrentThread.ManagedThreadId);&lt;/span&gt;&lt;br&gt;
        &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style="background:#ffffff;color:#000000"&gt;loader.Start(action);&lt;/span&gt;&lt;br&gt;
&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Sleep(5000);&lt;/span&gt;&lt;br&gt;
&lt;span style="background:#ffffff;color:#000000"&gt;loader.StopAndWait();&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;So going back to my original requirements, it became easy to create a Windows Service where the Action is to read from a processing queue and call a web service; where the MDOP is reduced when the service response times increase.&lt;/p&gt;

&lt;h3&gt;Summary&lt;/h3&gt;

&lt;p&gt;There are a variety of possible approaches one could take for Action processing, where the number of processing threads is varied based on task execution times. I chose to explore the custom task Scheduler approach as it offered the greatest amount of flexibility and reuse for a variety of other possible scenarios.&lt;/p&gt;

&lt;p&gt;As a final reminder the code download can be located &lt;a title="Execution Time Based Heuristic Custom Task Scheduler" href="http://code.msdn.microsoft.com/Execution-Time-Based-dd4dbdb6" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10355229" width="1" height="1"&gt;</content><author><name>Carl Nolan</name><uri>http://blogs.msdn.com/carlnolan/ProfileUrlRedirect.ashx</uri></author><category term="Parallel Processing" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Parallel+Processing/" /><category term="Task Parallel Library" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Task+Parallel+Library/" /><category term="C#" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/C_2300_/" /><category term="Task" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Task/" /><category term=".Net" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/-Net/" /><category term="Threading" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Threading/" /><category term="Custom Task Scheduler" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Custom+Task+Scheduler/" /></entry><entry><title>Framework for .Net Hadoop MapReduce Job Submission TextOutput Type</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/carlnol/archive/2012/07/10/framework-for-net-hadoop-mapreduce-job-submission-textoutput-type.aspx" /><id>http://blogs.msdn.com/b/carlnol/archive/2012/07/10/framework-for-net-hadoop-mapreduce-job-submission-textoutput-type.aspx</id><published>2012-07-10T21:10:10Z</published><updated>2012-07-10T21:10:10Z</updated><content type="html">&lt;p&gt;Some recent changes made to the “&lt;a href="http://code.msdn.microsoft.com/Framework-for-Composing-af656ef7"&gt;Generics based Framework for .Net Hadoop MapReduce Job Submission&lt;/a&gt;” code were to support Json and Binary Serialization from Mapper, in and out of Combiners, and out from the Reducer. However, this precluded one from controlling the format of the Text output. Say one wanted to create a tab delimited string from the Reducer.&amp;#160; This could only be done using Json Serialization. To better support allowing one to construct the final text output I have created a new &lt;font face="Consolas"&gt;TextOutput&lt;/font&gt; type.&lt;/p&gt;  &lt;p&gt;This &lt;font face="Consolas"&gt;TextOutput&lt;/font&gt; type is simple in structure. However, when this type is encountered during the serialization process, both Json and Binary serialization are bypassed and the text is written out in its raw format; including tabs and other characters usually escaped by the Json serializer.&lt;/p&gt;  &lt;p&gt;As an example here is a modified version of one of the C# Reducer samples that supports both Json and Text output:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2310bede-324b-4f04-80e8-ca596f7213f5" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #f3f3f3; max-height: 500px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#0000ff"&gt;namespace&lt;/span&gt; MSDN.Hadoop.MapReduceCSharp&lt;br&gt; {&lt;br&gt;     [&lt;span style="color:#2b91af"&gt;DataContract&lt;/span&gt;]&lt;br&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;MobilePhoneRange&lt;/span&gt;&lt;br&gt;     {&lt;br&gt;         [&lt;span style="color:#2b91af"&gt;DataMember&lt;/span&gt;] &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt; MinTime { &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;br&gt;         [&lt;span style="color:#2b91af"&gt;DataMember&lt;/span&gt;] &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt; MaxTime { &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;br&gt; &lt;br&gt;         &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; MobilePhoneRange(&lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt; minTime, &lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt; maxTime)&lt;br&gt;         {&lt;br&gt;             &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.MinTime = minTime;&lt;br&gt;             &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.MaxTime = maxTime;&lt;br&gt;         }&lt;br&gt; &lt;br&gt;         &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TextOutput&lt;/span&gt; ToText(&lt;span style="color:#0000ff"&gt;string&lt;/span&gt; format)&lt;br&gt;         {&lt;br&gt;             &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TextOutput&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;String&lt;/span&gt;.Format(&lt;span style="color:#a31515"&gt;@&amp;quot;({0}, {1})&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.MinTime.ToString(format), &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.MaxTime.ToString(format)));&lt;br&gt;         }&lt;br&gt;     }&lt;br&gt; &lt;br&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;MobilePhoneRangeReducer&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;ReducerBase&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;MobilePhoneRange&lt;/span&gt;&amp;gt;&lt;br&gt;     {&lt;br&gt;         &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;MobilePhoneRange&lt;/span&gt;&amp;gt;&amp;gt; Reduce(&lt;span style="color:#0000ff"&gt;string&lt;/span&gt; key, &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt;&amp;gt; value)&lt;br&gt;         {&lt;br&gt;             &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; baseRange = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;MobilePhoneRange&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt;.MaxValue, &lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt;.MinValue);&lt;br&gt;             &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; rangeValue = value.Aggregate(baseRange, (accSpan, timespan) =&amp;gt;&lt;br&gt;                 &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;MobilePhoneRange&lt;/span&gt;((timespan &amp;lt; accSpan.MinTime) ? timespan : accSpan.MinTime, (timespan &amp;gt; accSpan.MaxTime ) ? timespan : accSpan.MaxTime));&lt;br&gt; &lt;br&gt;             &lt;span style="color:#0000ff"&gt;yield&lt;/span&gt; &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;MobilePhoneRange&lt;/span&gt;&amp;gt;(key, rangeValue);&lt;br&gt;         }&lt;br&gt;     }&lt;br&gt; &lt;br&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;MobilePhoneRangeTextReducer&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;ReducerBase&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;TextOutput&lt;/span&gt;&amp;gt;&lt;br&gt;     {&lt;br&gt;         &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;TextOutput&lt;/span&gt;&amp;gt;&amp;gt; Reduce(&lt;span style="color:#0000ff"&gt;string&lt;/span&gt; key, &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt;&amp;gt; value)&lt;br&gt;         {&lt;br&gt;             &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; baseRange = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;MobilePhoneRange&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt;.MaxValue, &lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt;.MinValue);&lt;br&gt;             &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; rangeValue = value.Aggregate(baseRange, (accSpan, timespan) =&amp;gt;&lt;br&gt;                 &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;MobilePhoneRange&lt;/span&gt;((timespan &amp;lt; accSpan.MinTime) ? timespan : accSpan.MinTime, (timespan &amp;gt; accSpan.MaxTime) ? timespan : accSpan.MaxTime));&lt;br&gt; &lt;br&gt;             &lt;span style="color:#0000ff"&gt;yield&lt;/span&gt; &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;TextOutput&lt;/span&gt;&amp;gt;(key, rangeValue.ToText(&lt;span style="color:#a31515"&gt;&amp;quot;G&amp;quot;&lt;/span&gt;));&lt;br&gt;         }&lt;br&gt;     }&lt;br&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;For the sample Reducer above the Json serialization output would be:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;Android {&amp;quot;MaxTime&amp;quot;:&amp;quot;PT23H59M54S&amp;quot;,&amp;quot;MinTime&amp;quot;:&amp;quot;PT6S&amp;quot;}     &lt;br /&gt;RIM OS&amp;#160; {&amp;quot;MaxTime&amp;quot;:&amp;quot;PT23H59M58S&amp;quot;,&amp;quot;MinTime&amp;quot;:&amp;quot;PT1M7S&amp;quot;}      &lt;br /&gt;Unknown {&amp;quot;MaxTime&amp;quot;:&amp;quot;PT23H52M36S&amp;quot;,&amp;quot;MinTime&amp;quot;:&amp;quot;PT36S&amp;quot;}      &lt;br /&gt;Windows Phone&amp;#160;&amp;#160; {&amp;quot;MaxTime&amp;quot;:&amp;quot;PT23H55M17S&amp;quot;,&amp;quot;MinTime&amp;quot;:&amp;quot;PT32S&amp;quot;}      &lt;br /&gt;iPhone OS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;quot;MaxTime&amp;quot;:&amp;quot;PT23H59M50S&amp;quot;,&amp;quot;MinTime&amp;quot;:&amp;quot;PT1S&amp;quot;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The corresponding Text Output would be:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;Android (0:00:00:06.0000000, 0:23:59:54.0000000)     &lt;br /&gt;RIM OS&amp;#160; (0:00:01:07.0000000, 0:23:59:58.0000000)      &lt;br /&gt;Unknown (0:00:00:36.0000000, 0:23:52:36.0000000)      &lt;br /&gt;Windows Phone&amp;#160;&amp;#160; (0:00:00:32.0000000, 0:23:55:17.0000000)      &lt;br /&gt;iPhone OS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (0:00:00:01.0000000, 0:23:59:50.0000000)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;As mentioned the actual definition of the &lt;font face="Consolas"&gt;TextOutput&lt;/font&gt; type is simple and is just a wrapper over a string, although depending on needs this may change:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:261a29b9-0b73-480d-a6d8-cdc37f245019" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #f3f3f3; max-height: 500px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#0000ff"&gt;type&lt;/span&gt; TextOutput(value:string) = &lt;br&gt; &lt;br&gt;     &lt;span style="color:#008000"&gt;// Internal text value&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;let&lt;/span&gt; &lt;span style="color:#0000ff"&gt;mutable&lt;/span&gt; text = value&lt;br&gt; &lt;br&gt;     &lt;span style="color:#008000"&gt;/// String value of the TextOutput class&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;member&lt;/span&gt; this.Text&lt;br&gt;         &lt;span style="color:#0000ff"&gt;with&lt;/span&gt; get () = text&lt;br&gt;         &lt;span style="color:#0000ff"&gt;and&lt;/span&gt; set (value) = text &amp;lt;- value&lt;br&gt; &lt;br&gt;     &lt;span style="color:#008000"&gt;/// Byte array value of the TextOutput class&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;member&lt;/span&gt; this.Bytes&lt;br&gt;         &lt;span style="color:#0000ff"&gt;with&lt;/span&gt; get() = Encoding.UTF8.GetBytes(text)&lt;br&gt;         &lt;span style="color:#0000ff"&gt;and&lt;/span&gt; set (value:byte array) = text &amp;lt;- Encoding.UTF8.GetString(value)&lt;br&gt; &lt;br&gt;     &lt;span style="color:#0000ff"&gt;new&lt;/span&gt;(value:byte array) = &lt;br&gt;         TextOutput(Encoding.UTF8.GetString(value))&lt;br&gt; &lt;br&gt;     &lt;span style="color:#0000ff"&gt;new&lt;/span&gt;(value:TextOutput) =&lt;br&gt;         TextOutput(value.Text)&lt;br&gt; &lt;br&gt;     &lt;span style="color:#0000ff"&gt;new&lt;/span&gt;() = &lt;br&gt;         TextOutput(String.Empty)&lt;br&gt; &lt;br&gt;     &lt;span style="color:#008000"&gt;/// Clear Text &lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;member&lt;/span&gt; this.Clear() = &lt;br&gt;         text &amp;lt;- String.Empty&lt;br&gt; &lt;br&gt;     &lt;span style="color:#008000"&gt;/// Append Text&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;member&lt;/span&gt; this.Append(value:string) = &lt;br&gt;         text &amp;lt;- text + value&lt;br&gt;         text&lt;br&gt; &lt;br&gt;     &lt;span style="color:#008000"&gt;/// ToString override&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; this.ToString() =&lt;br&gt;         text&lt;br&gt; &lt;br&gt;     &lt;span style="color:#008000"&gt;///Equals override&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; this.Equals(value:obj) =&lt;br&gt;         &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; not (value.GetType() = typeof&amp;lt;TextOutput&amp;gt;) &lt;span style="color:#0000ff"&gt;then&lt;/span&gt;&lt;br&gt;             &lt;span style="color:#0000ff"&gt;false&lt;/span&gt;&lt;br&gt;         &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;&lt;br&gt;             &lt;span style="color:#0000ff"&gt;let&lt;/span&gt; objText = (value :?&amp;gt; TextOutput)&lt;br&gt;             text.Equals(objText.Text)&lt;br&gt; &lt;br&gt;     &lt;span style="color:#008000"&gt;/// GetHasCode override&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; this.GetHashCode() =&lt;br&gt;         text.GetHashCode()&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;One of the main rationales for adding the &lt;font face="Consolas"&gt;TextOutput&lt;/font&gt; support is so that data output by the framework can be easily used by Hive CREATE TABLE statements.&lt;/p&gt;  &lt;p&gt;Hope you find this change useful.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10328537" width="1" height="1"&gt;</content><author><name>Carl Nolan</name><uri>http://blogs.msdn.com/carlnolan/ProfileUrlRedirect.ashx</uri></author><category term="Hadoop Streaming" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop+Streaming/" /><category term="Hadoop" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop/" /><category term=".Net" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/-Net/" /><category term=".Net Programming" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/-Net+Programming/" /><category term="Serialization" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Serialization/" /><category term="Json Serialization" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Json+Serialization/" /><category term="Hadoop.Net" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop-Net/" /></entry><entry><title>C# MapReduce Based Co-occurrence Item Based Recommender</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/carlnol/archive/2012/07/09/c-mapreduce-based-co-occurrence-item-based-recommender.aspx" /><id>http://blogs.msdn.com/b/carlnol/archive/2012/07/09/c-mapreduce-based-co-occurrence-item-based-recommender.aspx</id><published>2012-07-09T19:17:20Z</published><updated>2012-07-09T19:17:20Z</updated><content type="html">&lt;p&gt;As promised, to conclude the &lt;a href="http://code.msdn.microsoft.com/Co-occurrence-Approach-to-57027db7"&gt;Co-occurrence Approach to an Item Based Recommender&lt;/a&gt; posts I wanted to port the MapReduce code to C#; just for kicks and to prove the code is also easy to write in C#. For an explanation of the MapReduce post review the previous article:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://blogs.msdn.com/b/carlnol/archive/2012/07/07/mapreduce-based-co-occurrence-approach-to-an-item-based-recommender.aspx" href="http://blogs.msdn.com/b/carlnol/archive/2012/07/07/mapreduce-based-co-occurrence-approach-to-an-item-based-recommender.aspx"&gt;http://blogs.msdn.com/b/carlnol/archive/2012/07/07/mapreduce-based-co-occurrence-approach-to-an-item-based-recommender.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The latest version of the code now includes the &lt;font face="Consolas"&gt;MSDN.Recommender.MapReduceCs&lt;/font&gt; project, that is a full C# implementation of the corresponding F# project; &lt;font face="Consolas"&gt;MSDN.Recommender.MapReduce&lt;/font&gt;. These code variants are intentionally similar in structure.&lt;/p&gt;  &lt;p&gt;The code for the Order Mapper is as follows:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:25c74a8c-ba52-449d-befe-b137e43ee173" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Order Mapper&lt;/div&gt; &lt;div style="background: #ddd; max-height: 500px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderVectorMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;MapperBaseText&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantityList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Configuration values&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; qtyMaximum = 5.0;                      &lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Maximum rating contribution for an item&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; recentFactor = 2.0;                    &lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Quantity increase factor for recent items&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; baseDate = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Today.AddMonths(-3);    &lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Date for a recent item&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantityList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; products = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantityList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;? currentOrder = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Converts an order Id to a string key&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; getOrderKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderId)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;String&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Format(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;{0:D}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, orderId);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Adds a quantity factor based on recent orders&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; orderFactor(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderDetail&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; order)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Compare(order.OrderDate, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderVectorMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.baseDate) &amp;gt; 0)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderVectorMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.recentFactor;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; 1.0;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Map the data from input name/value to output name/value&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantityList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt; Map(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; value)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Ensure order can be derived&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderDetail&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; order = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;order = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Helpers&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.ParseInputData(value);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;catch&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ArgumentException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;order = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Process the order&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (order != &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; quantity = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Math&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Min(((&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)order.OrderQty), &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderVectorMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.qtyMaximum) * &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderVectorMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.orderFactor(order);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; product = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(order.ProductId, quantity);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.currentOrder.HasValue &amp;amp;&amp;amp; (order.OrderId != &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.currentOrder.Value))&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderVectorMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.getOrderKey(currentOrder.Value), &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.products);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.products.Clear();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.currentOrder = order.OrderId;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.products.Add(product);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Context&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.IncrementCounter(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;ORDERS&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Skipped Lines&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Output remaining Map items&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantityList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt; Cleanup()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.currentOrder.HasValue)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderVectorMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.getOrderKey(currentOrder.Value), &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.products);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;And that of the Order Reducer is:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:92121ace-3565-4689-9c0d-ec0d96024c53" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Order Reducer&lt;/div&gt; &lt;div style="background: #ddd; max-height: 500px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OrderVectorReducer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ReducerBase&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantityList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantityList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Reduce the order data into a product list&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantityList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt; Reduce(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; key, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantityList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; values)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; products = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantityList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;foreach&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; prodList &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; values)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;products.AddRange(prodList);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(key, products);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Your friend when writing the C# code is the &lt;font face="Consolas"&gt;yield return&lt;/font&gt; command for emitting data, and the &lt;font face="Consolas"&gt;Tuple.Create()&lt;/font&gt; command for creating the key/value pairs. The two commands enable one to return a key/value sequence; namely a .Net IEnumerable.&lt;/p&gt;  &lt;p&gt;For completeness the code for the Product Mapper is:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9a6c686b-d432-49ab-83f5-9493dae92777" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Product Mapper&lt;/div&gt; &lt;div style="background: #ddd; max-height: 500px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductVectorMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;MapperBaseText&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; maxSize = 1024 * 1024;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Dictionary&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; prodPairs = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Dictionary&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductVectorMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.maxSize);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Converts an order Id to a string key&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; getProductKey(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; productId)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;String&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Format(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;{0:D}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, productId);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Parses an input line of format List&amp;lt;ProductQuantity&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantityList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; deserialize(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; input)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;[] keyValue = input.Split(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;#39;&amp;#92;t&amp;#39;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Helpers&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.ParseProductQuantityList(keyValue[1].Trim());&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// calculates the pairs for an order&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;T, T&amp;gt;&amp;gt; pairs&amp;lt;T&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;List&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;T&amp;gt; items)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; count = items.Count;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (count == 2)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(items[0], items[1]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (count &amp;gt; 2)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;for&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; idxOut = 0; idxOut &amp;lt;= (count - 2); idxOut++)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;for&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; idxIn = (idxOut + 1); idxIn &amp;lt;= (count - 1); idxIn++)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(items[idxOut], items[idxIn]);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Adds to the table&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; addRow(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; idx, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; qty)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.prodPairs.ContainsKey(idx))&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.prodPairs[idx] = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.prodPairs[idx] + qty;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.prodPairs[idx] = qty;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Defines a sequence of the current pairs&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt; currents()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;foreach&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; item &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; prodPairs)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; product1 = item.Key.Item1;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; product2 = item.Key.Item2;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductVectorMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.getProductKey(product1), &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(product2, item.Value));                &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;prodPairs.Clear();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Map the data from input name/value to output name/value&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt; Map(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; value)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; products = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductVectorMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.pairs&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductVectorMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.deserialize(value));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;foreach&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; product &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; products)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; product1 = product.Item1;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; product2 = product.Item2;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; qty = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Math&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Max(product1.Quantity, product2.Quantity);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.addRow(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(product1.ProductId, product2.ProductId), qty);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.addRow(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(product2.ProductId, product1.ProductId), qty);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (prodPairs.Count &amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductVectorMapper&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.maxSize)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; currents();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Enumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Empty&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt;();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Output remaining Map items&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt; Cleanup()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; currents();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;That of the Product Combiner is:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1f411bf1-5658-427d-90a9-32c864ebef3d" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Product Combiner&lt;/div&gt; &lt;div style="background: #ddd; max-height: 500px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductVectorCombiner&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;CombinerBase&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Combine the data from input name/value to output name/value&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt; Combine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; key, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; values)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; maxSize = 10000;               &lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Expected number of product correlations&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; products = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Dictionary&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(maxSize);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Process the combiner input adding to the table&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;foreach&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; product &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; values)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (products.ContainsKey(product.ProductId))&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;products[product.ProductId] = products[product.ProductId] + product.Quantity;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;products[product.ProductId] = product.Quantity;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Return the combiner input&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; products.Select(item =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(key, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(item.Key, item.Value)));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt; And finally, that of the Product Reducer is:&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1f2927cf-6369-4af1-a55d-e3c7f20c0675" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Product Reducer&lt;/div&gt; &lt;div style="background: #ddd; max-height: 500px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductVectorReducer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ReducerBase&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductRecommendations&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Reduce the data from input name/value to output name/value&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductRecommendations&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt; Reduce(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; key, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductQuantity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; values)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Configuration values&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; entryThreshold = 20.0;                     &lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Minimum correlations for matrix inclusion&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; matrixSize = 10000;                           &lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Expected Correlations for Hash Table init&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; minItem = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Int32&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.MaxValue;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; maxItem = 0;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; rcTable = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Dictionary&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;double&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(matrixSize);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Process the combiner input adding to the table&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;foreach&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; product &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; values)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; idx = product.ProductId;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;minItem = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Math&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Min(idx, minItem);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;maxItem = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Math&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Max(idx, maxItem);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (rcTable.ContainsKey(product.ProductId))&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;rcTable[product.ProductId] = rcTable[product.ProductId] + product.Quantity;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;rcTable[product.ProductId] = product.Quantity;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; offset = minItem;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; size = maxItem + 1 - minItem;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// Build the sparse vector&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; vector = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;SparseVector&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(size);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;foreach&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; item &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; rcTable)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (item.Value &amp;gt; entryThreshold)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;vector[item.Key - offset] = item.Value;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; recommendations = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Types&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ProductRecommendations&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Int32&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Parse(key), offset, vector);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Context&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.IncrementCounter(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;PRODUCTS&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Recommendations Written&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;yield&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Tuple&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(key, recommendations);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;A lot of the processing is based upon processing &lt;font face="Consolas"&gt;IEnumerable&lt;/font&gt; sequences. For this reason &lt;font face="Consolas"&gt;foreach&lt;/font&gt; and Linq expressions are used a lot. I could have defined a ForEach IEnumerable extension, to use Linq exclusively, but have preferred the C# syntax.&lt;/p&gt;  &lt;p&gt;One difference in the final Reducer is how the Sparse Matrix is defined. In the F# code an F# extension allows one to build a SparseMatrix type by providing a sequence of index/value tuples. In the C# code one has to define an empty SparseMatrix and then interactively set the element values.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: There may be some confusion in the usage of the &lt;font face="Consolas"&gt;float&lt;/font&gt; type for .Net programmers, when switching between C# and F#, due to F#’s naming for floating-point number types. F# &lt;font face="Consolas"&gt;float&lt;/font&gt; type corresponds to System.Double in .NET (which is called double in C#), and F# float32 type corresponds to System.Single in .NET (which is called float in C#). For this reason I have switched to using the type double in F#, as it is another type alias for the System.Double type.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Of course the recommendations produced by the C# code are the same as the F# code, and clearly demonstrate that the Framework cleanly support writing MapReduce jobs in C#. I personally find the F# code more succinct and easier to read, but this is my personal preference.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10328134" width="1" height="1"&gt;</content><author><name>Carl Nolan</name><uri>http://blogs.msdn.com/carlnolan/ProfileUrlRedirect.ashx</uri></author><category term="C#" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/C_2300_/" /><category term="Hadoop Streaming" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop+Streaming/" /><category term="Hadoop" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Hadoop/" /><category term="MapReduce" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/MapReduce/" /><category term=".Net" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/-Net/" /><category term=".Net Programming" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/-Net+Programming/" /><category term="Matrix" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Matrix/" /><category term="Recommendations" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Recommendations/" /><category term="Machine Learning" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Machine+Learning/" /><category term="Vector" scheme="http://blogs.msdn.com/b/carlnol/archive/tags/Vector/" /></entry></feed>