<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>bloggo ergo sum</title>
	<atom:link href="http://bloggoergosum.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://bloggoergosum.com</link>
	<description></description>
	<lastBuildDate>Fri, 20 Aug 2010 15:37:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>New Concurrency Support in .NET 4</title>
		<link>http://bloggoergosum.com/2010/08/20/new-concurrency-support-in-net-4/</link>
		<comments>http://bloggoergosum.com/2010/08/20/new-concurrency-support-in-net-4/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 13:59:40 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[concurrency]]></category>

		<guid isPermaLink="false">http://bloggoergosum.com/?p=526</guid>
		<description><![CDATA[I&#8217;ve been reading about some of the new support for parallelism and concurrency in version 4 of the .NET Framework, and came across a really good paper on parallel design patterns by Steven Toub (most or all of which seems &#8230; <a href="http://bloggoergosum.com/2010/08/20/new-concurrency-support-in-net-4/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been reading about some of the new support for parallelism and concurrency in version 4 of the .NET Framework, and came across a <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=86b3d32b-ad26-4bb8-a3ae-c1637026c3ee&amp;displaylang=en">really good paper on parallel design patterns by Steven Toub</a> (most or all of which seems to also be covered in the <em><a href="http://parallelpatterns.codeplex.com/">Parallel Programming with Microsoft .NET</a></em><a href="http://parallelpatterns.codeplex.com/"> book</a>).  There are some really convenient additions to the framework in .NET 4 that help make parallelism easier and less error-prone.  The point of this post is to illuminate a good example of how this is so.</p>
<p>About a year ago, I was working on a class library that was supposed to do some filtering on streams &#8211; something along the lines of Boost.Iostreams which gives you the ability to create pluggable, customized &#8220;sources&#8221; and &#8220;sinks&#8221; (producers and consumers) and filters set up in a stream pipeline.  One simple application of such a pipeline (and apparently Toub&#8217;s favorite) is that of compressing and encrypting some data.</p>
<div id="attachment_527" class="wp-caption aligncenter" style="width: 504px"><a href="http://bloggoergosum.com/wp-content/uploads/2010/08/Stream-Pipeline-Diagrams.png"><img class="size-full wp-image-527" title="Stream Pipeline Diagram" src="http://bloggoergosum.com/wp-content/uploads/2010/08/Stream-Pipeline-Diagrams.png" alt="" width="494" height="50" /></a><p class="wp-caption-text">Input is read from the source stream, passed through the filters, and written to the output stream.</p></div>
<p>I found <a href="http://msdn.microsoft.com/en-us/magazine/cc163290.aspx">Toub&#8217;s MSDN Magazine article</a> describing how one could parallelize this, and incorporated the sample into my class library.  The basic idea is that you set up a blocking queue of chunks of data, and then use that queue (or queues) to connect the inputs and outputs of the streams and filters, and just let it fly.  The queue serves as the synchronization mechanism, fulfilling the producer role required by the input side of each piece, and fulfilling the consumer role required by the output side of each piece.  Below is the sample code.</p>
<p><span id="more-526"></span></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> BlockingStream <span style="color: #008000;">:</span> Stream
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">object</span> _lockForRead<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">object</span> _lockForAll<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">private</span> Queue _chunks<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> _currentChunk<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">int</span> _currentChunkPosition<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">private</span> ManualResetEvent _doneWriting<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">private</span> ManualResetEvent _dataAvailable<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">private</span> WaitHandle<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> _events<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">int</span> _doneWritingHandleIndex<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">private</span> volatile <span style="color: #FF0000;">bool</span> _illegalToWrite<span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> BlockingStream<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        _chunks <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Queue<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        _doneWriting <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ManualResetEvent<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">false</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        _dataAvailable <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ManualResetEvent<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">false</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        _events <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> WaitHandle<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> _dataAvailable, _doneWriting <span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
        _doneWritingHandleIndex <span style="color: #008000;">=</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
        _lockForRead <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">object</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        _lockForAll <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">object</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> CanRead <span style="color: #000000;">&#123;</span> get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> true<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span> <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> CanSeek <span style="color: #000000;">&#123;</span> get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> false<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span> <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> CanWrite <span style="color: #000000;">&#123;</span> get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> <span style="color: #008000;">!</span>_illegalToWrite<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span> <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> Flush<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">long</span> Length <span style="color: #000000;">&#123;</span>
        get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotSupportedException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span> <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">long</span> Position <span style="color: #000000;">&#123;</span>
        get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotSupportedException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
        set <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotSupportedException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span> <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">long</span> Seek<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">long</span> offset, SeekOrigin origin<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotSupportedException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> SetLength<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">long</span> value<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotSupportedException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">int</span> Read<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> buffer, <span style="color: #FF0000;">int</span> offset, <span style="color: #FF0000;">int</span> count<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>buffer <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentNullException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;buffer&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>offset <span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span> <span style="color: #FF0000;">0</span> <span style="color: #008000;">||</span> offset <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;=</span> buffer.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span>
            <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentOutOfRangeException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;offset&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>count <span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span> <span style="color: #FF0000;">0</span> <span style="color: #008000;">||</span> offset <span style="color: #008000;">+</span> count <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span> buffer.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span>
            <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentOutOfRangeException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;count&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>_dataAvailable <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
            <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ObjectDisposedException<span style="color: #000000;">&#40;</span>GetType<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>count <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">return</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">while</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #FF0000;">int</span> handleIndex <span style="color: #008000;">=</span> WaitHandle.<span style="color: #0000FF;">WaitAny</span><span style="color: #000000;">&#40;</span>_events<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">lock</span> <span style="color: #000000;">&#40;</span>_lockForRead<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">lock</span> <span style="color: #000000;">&#40;</span>_lockForAll<span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#123;</span>
                    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>_currentChunk <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
                    <span style="color: #000000;">&#123;</span>
                        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>_chunks.<span style="color: #0000FF;">Count</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span>
                        <span style="color: #000000;">&#123;</span>
                            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>handleIndex <span style="color: #008000;">==</span> _doneWritingHandleIndex<span style="color: #000000;">&#41;</span>
                                <span style="color: #0600FF;">return</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
                            <span style="color: #0600FF;">else</span> continue<span style="color: #008000;">;</span>
                        <span style="color: #000000;">&#125;</span>
                        _currentChunk <span style="color: #008000;">=</span> _chunks.<span style="color: #0000FF;">Dequeue</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                        _currentChunkPosition <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
                    <span style="color: #000000;">&#125;</span>
                <span style="color: #000000;">&#125;</span>
&nbsp;
                <span style="color: #FF0000;">int</span> bytesAvailable <span style="color: #008000;">=</span>
                    _currentChunk.<span style="color: #0000FF;">Length</span> <span style="color: #008000;">-</span> _currentChunkPosition<span style="color: #008000;">;</span>
                <span style="color: #FF0000;">int</span> bytesToCopy<span style="color: #008000;">;</span>
                <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>bytesAvailable <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span> count<span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#123;</span>
                    bytesToCopy <span style="color: #008000;">=</span> count<span style="color: #008000;">;</span>
                    Buffer.<span style="color: #0000FF;">BlockCopy</span><span style="color: #000000;">&#40;</span>_currentChunk, _currentChunkPosition,
                        buffer, offset, count<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                    _currentChunkPosition <span style="color: #008000;">+=</span> count<span style="color: #008000;">;</span>
                <span style="color: #000000;">&#125;</span>
                <span style="color: #0600FF;">else</span>
                <span style="color: #000000;">&#123;</span>
                    bytesToCopy <span style="color: #008000;">=</span> bytesAvailable<span style="color: #008000;">;</span>
                    Buffer.<span style="color: #0000FF;">BlockCopy</span><span style="color: #000000;">&#40;</span>_currentChunk, _currentChunkPosition,
                        buffer, offset, bytesToCopy<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                    _currentChunk <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span>
                    _currentChunkPosition <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
                    <span style="color: #0600FF;">lock</span> <span style="color: #000000;">&#40;</span>_lockForAll<span style="color: #000000;">&#41;</span>
                    <span style="color: #000000;">&#123;</span>
                        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>_chunks.<span style="color: #0000FF;">Count</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span> _dataAvailable.<span style="color: #0000FF;">Reset</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                    <span style="color: #000000;">&#125;</span>
                <span style="color: #000000;">&#125;</span>
                <span style="color: #0600FF;">return</span> bytesToCopy<span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> Write<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> buffer, <span style="color: #FF0000;">int</span> offset, <span style="color: #FF0000;">int</span> count<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>buffer <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentNullException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;buffer&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>offset <span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span> <span style="color: #FF0000;">0</span> <span style="color: #008000;">||</span> offset <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;=</span> buffer.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span>
            <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentOutOfRangeException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;offset&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>count <span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span> <span style="color: #FF0000;">0</span> <span style="color: #008000;">||</span> offset <span style="color: #008000;">+</span> count <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span> buffer.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span>
            <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentOutOfRangeException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;count&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>_dataAvailable <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
            <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ObjectDisposedException<span style="color: #000000;">&#40;</span>GetType<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>count <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span> return<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> chunk <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span>count<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
        Buffer.<span style="color: #0000FF;">BlockCopy</span><span style="color: #000000;">&#40;</span>buffer, offset, chunk, <span style="color: #FF0000;">0</span>, count<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">lock</span> <span style="color: #000000;">&#40;</span>_lockForAll<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>_illegalToWrite<span style="color: #000000;">&#41;</span>
                <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> InvalidOperationException<span style="color: #000000;">&#40;</span>
                    <span style="color: #666666;">&quot;Writing has already been completed.&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            _chunks.<span style="color: #0000FF;">Enqueue</span><span style="color: #000000;">&#40;</span>chunk<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            _dataAvailable.<span style="color: #0000FF;">Set</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> SetEndOfStream<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>_dataAvailable <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
            <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ObjectDisposedException<span style="color: #000000;">&#40;</span>GetType<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">lock</span> <span style="color: #000000;">&#40;</span>_lockForAll<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            _illegalToWrite <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
            _doneWriting.<span style="color: #0000FF;">Set</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> Close<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">Close</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>_dataAvailable <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            _dataAvailable.<span style="color: #0000FF;">Close</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            _dataAvailable <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>_doneWriting <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            _doneWriting.<span style="color: #0000FF;">Close</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            _doneWriting <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>As you can observe in the above, most of the work in the design of Toub&#8217;s <code>BlockingStream</code> class is invested in the synchronization mechanisms.  The queue that stores up blocks of data to be worked on is a simple .NET <code>Queue</code>, which is not thread-safe for this application.  The <code>Read</code> and <code>Write</code> operations use several synchronization primitives to prevent each component in the pipeline from stomping on the data needed by the others.  When you just read the above code from top to bottom, it seems fairly straight forward, but designing something even as simple as this takes some thought.  It is a non-trivial design, particularly for the inexperienced.  Another downside to the <code>BlockingStream</code> class is that it doesn&#8217;t actually get you concurrency &#8211; it just gets you synchronization.  You still have to fit it into your concurrency designs, whatever they may be.  Toub does provide a StreamPipeline class to help you chain these things together.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> StreamPipeline <span style="color: #008000;">:</span> IDisposable
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">private</span> Action<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> _filters<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">private</span> List _blockingStreams<span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> StreamPipeline<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">params</span> Action<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> filters<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>filters <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentNullException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;filters&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>filters.<span style="color: #0000FF;">Length</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span> <span style="color: #008000;">||</span> Array.<span style="color: #0000FF;">IndexOf</span><span style="color: #000000;">&#40;</span>filters, <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;=</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span>
            <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;filters&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        _filters <span style="color: #008000;">=</span> filters<span style="color: #008000;">;</span>
&nbsp;
        _blockingStreams <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #000000;">&#40;</span>_filters.<span style="color: #0000FF;">Length</span> <span style="color: #008000;">-</span> <span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span> filters.<span style="color: #0000FF;">Length</span><span style="color: #008000;">-</span><span style="color: #FF0000;">1</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            _blockingStreams.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> BlockingStream<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Run<span style="color: #000000;">&#40;</span>Stream input, Stream output<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>_blockingStreams <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
            <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ObjectDisposedException<span style="color: #000000;">&#40;</span>GetType<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>input <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentNullException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;input&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #008000;">!</span>input.<span style="color: #0000FF;">CanRead</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;input&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>output <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentNullException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;output&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #008000;">!</span>output.<span style="color: #0000FF;">CanWrite</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;output&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        ThreadStart lastStage <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span> _filters.<span style="color: #0000FF;">Length</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            Stream stageInput <span style="color: #008000;">=</span> i <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span> <span style="color: #008000;">?</span> input <span style="color: #008000;">:</span> _blockingStreams<span style="color: #000000;">&#91;</span>i <span style="color: #008000;">-</span> <span style="color: #FF0000;">1</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
            Stream stageOutput <span style="color: #008000;">=</span>
                i <span style="color: #008000;">==</span> _filters.<span style="color: #0000FF;">Length</span> <span style="color: #008000;">-</span> <span style="color: #FF0000;">1</span> <span style="color: #008000;">?</span> output <span style="color: #008000;">:</span> _blockingStreams<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
            Action filter <span style="color: #008000;">=</span> _filters<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
            ThreadStart stage <span style="color: #008000;">=</span> <span style="color: #FF0000;">delegate</span>
            <span style="color: #000000;">&#123;</span>
                filter<span style="color: #000000;">&#40;</span>stageInput, stageOutput<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>stageOutput <span style="color: #008000;">is</span> BlockingStream<span style="color: #000000;">&#41;</span>
                    <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>BlockingStream<span style="color: #000000;">&#41;</span>stageOutput<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">SetEndOfStream</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>i <span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span> _filters.<span style="color: #0000FF;">Length</span> <span style="color: #008000;">-</span> <span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                Thread t <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Thread<span style="color: #000000;">&#40;</span>stage<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                t.<span style="color: #0000FF;">IsBackground</span> <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
                t.<span style="color: #0000FF;">Start</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">else</span> lastStage <span style="color: #008000;">=</span> stage<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
        lastStage<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Dispose<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>_blockingStreams <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>BlockingStream stream <span style="color: #0600FF;">in</span> _blockingStreams<span style="color: #000000;">&#41;</span>
                stream.<span style="color: #0000FF;">Dispose</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            _blockingStreams <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Again, note how much of this code is devoted to managing Threads and synchronization issues.</p>
<p>Enter .NET 4.  The above class along with the concurrency you want can be more succinctly and transparently implemented using the <code>Task</code> and <code>BlockingCollection</code> classes.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.IO</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Collections.Concurrent</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Threading.Tasks</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">namespace</span> Git
<span style="color: #000000;">&#123;</span>
    <span style="color: #FF0000;">class</span> TransferStream <span style="color: #008000;">:</span> Stream
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">private</span> Stream m_WriteableStream<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">private</span> BlockingCollection m_Blocks<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">private</span> Task m_ProcessingTask<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> TransferStream<span style="color: #000000;">&#40;</span>Stream writeableStream<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #008080; font-style: italic;">// TODO validate arguments</span>
            m_WriteableStream <span style="color: #008000;">=</span> writeableStream<span style="color: #008000;">;</span>
            m_Blocks <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> BlockingCollection<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            m_ProcessingTask <span style="color: #008000;">=</span> Task.<span style="color: #0000FF;">Factory</span>.<span style="color: #0000FF;">StartNew</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&amp;</span>gt<span style="color: #008000;">;</span>
                <span style="color: #000000;">&#123;</span>
                    <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>var block <span style="color: #0600FF;">in</span> m_Blocks.<span style="color: #0000FF;">GetConsumingEnumerable</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
                    <span style="color: #000000;">&#123;</span>
                        m_WriteableStream.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span>block, <span style="color: #FF0000;">0</span>, block.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                    <span style="color: #000000;">&#125;</span>
                <span style="color: #000000;">&#125;</span>, TaskCreationOptions.<span style="color: #0000FF;">PreferFairness</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> CanWrite
        <span style="color: #000000;">&#123;</span>
            <span style="color: #008080; font-style: italic;">// TODO: check state of output stream</span>
            get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> true<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>       
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> Write<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> buffer, <span style="color: #FF0000;">int</span> offset, <span style="color: #FF0000;">int</span> count<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            var block <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span>count<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
            Buffer.<span style="color: #0000FF;">BlockCopy</span><span style="color: #000000;">&#40;</span>buffer, offset, block, <span style="color: #FF0000;">0</span>, count<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            m_Blocks.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>block<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> Close<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            m_Blocks.<span style="color: #0000FF;">CompleteAdding</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">try</span> <span style="color: #000000;">&#123;</span> m_ProcessingTask.<span style="color: #0000FF;">Wait</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">finally</span> <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">Close</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> CanRead
        <span style="color: #000000;">&#123;</span>
            get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotImplementedException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> CanSeek
        <span style="color: #000000;">&#123;</span>
            get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotImplementedException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> Flush<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotImplementedException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">long</span> Length
        <span style="color: #000000;">&#123;</span>
            get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotImplementedException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">long</span> Position
        <span style="color: #000000;">&#123;</span>
            get
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotImplementedException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            set
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotImplementedException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">int</span> Read<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> buffer, <span style="color: #FF0000;">int</span> offset, <span style="color: #FF0000;">int</span> count<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotImplementedException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">long</span> Seek<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">long</span> offset, SeekOrigin origin<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotImplementedException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> SetLength<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">long</span> value<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> NotImplementedException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>You can see by comparing the two that all the work done before to accomplish synchronization has been abstracted by the <code>BlockingCollection</code>, and we now get asynchronous pipelining through the use of the <code>Task</code> class.</p>
<p>Now this class can be used in an implementation like this:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> FilterStream<span style="color: #000000;">&#40;</span>Stream input, Stream output, Stream filter<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span>var t1 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> TransferStream<span style="color: #000000;">&#40;</span>output<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span>var t0 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> TransferStream<span style="color: #000000;">&#40;</span>filter<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        input.<span style="color: #0000FF;">CopyTo</span><span style="color: #000000;">&#40;</span>t0<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Using this pattern, it would be a trivial task to create a new StreamPipeline class whose sole purpose would be to provide a little syntactic sugar, making usage more like this:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> FilterStream<span style="color: #000000;">&#40;</span>Stream input, Stream output, Stream filter<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    StreamPipeline pipeline <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StreamPipeline<span style="color: #000000;">&#40;</span>input, output, filter<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    pipeline.<span style="color: #0000FF;">Run</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>One thing you might notice about the <code>TransferStream</code> class.  Firstly, a bunch of the required <code>Stream</code> methods aren&#8217;t really implemented.  In our contrived example, that might be alright, but one might want to implement all the methods for production use in a class library.</p>
]]></content:encoded>
			<wfw:commentRss>http://bloggoergosum.com/2010/08/20/new-concurrency-support-in-net-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
