<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://fabiogaluppo.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2ffabiogaluppo.spaces.live.com%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>The House of Software Engineer</title><description>The new house is here. The old is there: http://fabiogaluppo.blogspot.com/</description><link>http://fabiogaluppo.spaces.live.com/</link><language>en-US</language><pubDate>Mon, 25 Aug 2008 10:57:15 GMT</pubDate><lastBuildDate>Mon, 25 Aug 2008 10:57:15 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><live:identity><live:id>-5300274535508806924</live:id><live:alias>fabiogaluppo</live:alias></live:identity><image><title>The House of Software Engineer</title><url>http://tkfiles.storage.live.com/y1p1RvEOTZAlqp8vQupP-4fT1oBUFpnOw_YLZjWxhfuimfFaclBu6ANBw</url><link>http://fabiogaluppo.spaces.live.com/</link></image><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>Two versions for Lock-Free Stack</title><link>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!178.entry</link><description>&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The two codes below are implementations of lock-free stack structure. &lt;/div&gt;
&lt;div&gt;The purpose is the same, but the first version can be ported easily to other OSes.&lt;/div&gt;
&lt;div&gt;Performance benchmark is a lesson to the reader.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The raw C++ implementation. In C++0x we'll change &lt;a href="http://msdn.microsoft.com/en-us/library/ms684122(VS.85).aspx"&gt;Interlocked APIs&lt;/a&gt; to &lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2047.html"&gt;atomic operations&lt;/a&gt;:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;font color="#0000ff" size=2&gt;&lt;font color="#0000ff" size=1&gt;
&lt;div&gt;template &lt;/div&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;typename&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; T&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;struct&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; LockFreeStack&lt;/font&gt;&lt;br&gt;{&lt;br&gt;  LockFreeStack() : Head_( NULL ){}&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  void&lt;/font&gt;&lt;/font&gt; Push( T&amp;amp; value )&lt;br&gt;  {&lt;br&gt;    PNODE node = &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/font&gt; NODE( value );&lt;br&gt;    PNODE oldHead;&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;    do&lt;br&gt;&lt;/font&gt;&lt;/font&gt;    {&lt;br&gt;      node-&amp;gt;Next = oldHead = Head_; &lt;br&gt;    }&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;while&lt;/font&gt;&lt;/font&gt;( oldHead != &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;PNODE&amp;gt;( InterlockedCompareExchangePointer( &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;                                      reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;volatile&lt;/font&gt;&lt;/font&gt; PVOID*&amp;gt;(&amp;amp;Head_), node, oldHead ))); &lt;br&gt;  } &lt;/font&gt;
&lt;div&gt;&lt;br&gt;&lt;font size=1&gt;  T Pop()&lt;br&gt;  {&lt;br&gt;    PNODE node;&lt;br&gt;    PNODE oldHead;&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;    do&lt;br&gt;&lt;/font&gt;&lt;/font&gt;    {&lt;br&gt;      oldHead = Head_; &lt;br&gt;    }&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;while&lt;/font&gt;&lt;/font&gt;( oldHead != (node = &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;PNODE&amp;gt;( InterlockedCompareExchangePointer( &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;                                            reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;volatile&lt;/font&gt;&lt;/font&gt; PVOID*&amp;gt;(&amp;amp;Head_), Head_-&amp;gt;Next, oldHead ))));&lt;br&gt;&lt;br&gt;    T temp = node-&amp;gt;Data;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;    delete&lt;/font&gt;&lt;/font&gt; node;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;    return&lt;/font&gt;&lt;/font&gt; temp;&lt;br&gt;  }&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;private&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  typedef&lt;/font&gt;&lt;/font&gt; &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;struct&lt;/font&gt;&lt;/font&gt; NODE_TAG&lt;br&gt;  {&lt;br&gt;    NODE_TAG( T value ) : Next(NULL), Data(value){} &lt;br&gt;    NODE_TAG* Next; &lt;br&gt;    T Data;&lt;br&gt;  } NODE, *PNODE;&lt;br&gt;&lt;br&gt;  PNODE Head_;&lt;br&gt;&lt;br&gt;  LockFreeStack( &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;const&lt;/font&gt;&lt;/font&gt; LockFreeStack&amp;amp; ){}&lt;br&gt;  LockFreeStack&amp;amp; &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;operator&lt;/font&gt;&lt;/font&gt;=( &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;const&lt;/font&gt;&lt;/font&gt; LockFreeStack&amp;amp; ){}&lt;br&gt;};&lt;/font&gt;&lt;/div&gt;
&lt;p&gt;&lt;font size=1&gt;&lt;br&gt;&lt;/font&gt;Using a Windows API facility called &lt;a href="http://msdn.microsoft.com/en-us/library/ms684121(VS.85).aspx"&gt;Singly Linked Lists&lt;/a&gt;:  
&lt;p&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;template&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;typename&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; T&amp;gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;struct&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; LockFreeStack&lt;/font&gt;&lt;br&gt;{&lt;br&gt;  LockFreeStack()&lt;br&gt;  {&lt;br&gt;    Head_ = new_aligned&amp;lt;SLIST_HEADER&amp;gt;(); &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;    if&lt;/font&gt;&lt;/font&gt;( NULL == Head_ )&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;      throw&lt;/font&gt;&lt;/font&gt; &lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;quot;memory allocation failed&amp;quot;&lt;/font&gt;&lt;/font&gt;;&lt;br&gt;&lt;br&gt;    InitializeSListHead( Head_ );&lt;br&gt;  }&lt;br&gt;&lt;br&gt;  ~LockFreeStack()&lt;br&gt;  {&lt;br&gt;    InterlockedFlushSList( Head_ );&lt;br&gt;  }&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  void&lt;/font&gt;&lt;/font&gt; Push( T value )&lt;br&gt;  {&lt;br&gt;    Item_ = new_aligned&amp;lt;ITEM&amp;gt;();&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;    if&lt;/font&gt;&lt;/font&gt;( NULL == Item_ )&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;      throw&lt;/font&gt;&lt;/font&gt; &lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;quot;stack is full&amp;quot;&lt;/font&gt;&lt;/font&gt;;&lt;br&gt;&lt;/font&gt;
&lt;div&gt;&lt;font size=1&gt;    Item_-&amp;gt;Value = value;&lt;br&gt;    Entry_ = InterlockedPushEntrySList( Head_, &amp;amp;Item_-&amp;gt;Entry );&lt;br&gt;  }&lt;br&gt;&lt;br&gt;  T Pop()&lt;br&gt;  {&lt;br&gt;    PSLIST_ENTRY tempEntry = InterlockedPopEntrySList( Head_ );&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;    if&lt;/font&gt;&lt;/font&gt;( NULL == tempEntry )&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;      throw&lt;/font&gt;&lt;/font&gt; &lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;quot;stack is empty&amp;quot;&lt;/font&gt;&lt;/font&gt;;&lt;br&gt;&lt;br&gt;    Item_ = &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;PITEM&amp;gt;( tempEntry );&lt;br&gt;    T temp = Item_-&amp;gt;Value;&lt;br&gt;    _aligned_free( tempEntry );&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;    return&lt;/font&gt;&lt;/font&gt; temp;&lt;br&gt;  }&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;private&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  typedef&lt;/font&gt;&lt;/font&gt; &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;struct&lt;/font&gt;&lt;/font&gt; ITEM_TAG&lt;br&gt;  {&lt;br&gt;    SLIST_ENTRY Entry;&lt;br&gt;    T Value;&lt;br&gt;  } ITEM, *PITEM;&lt;br&gt;&lt;br&gt;  PSLIST_ENTRY Entry_;&lt;br&gt;  PSLIST_HEADER Head_;&lt;br&gt;  PITEM Item_;&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  template&lt;/font&gt;&lt;/font&gt; &amp;lt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/font&gt; M&amp;gt; M* new_aligned()&lt;br&gt;  {&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;    return&lt;/font&gt;&lt;/font&gt; &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;M*&amp;gt;(_aligned_malloc( &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;sizeof&lt;/font&gt;&lt;/font&gt;(M), MEMORY_ALLOCATION_ALIGNMENT ));&lt;br&gt;  }&lt;br&gt;&lt;br&gt;  LockFreeStack( &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;const&lt;/font&gt;&lt;/font&gt; LockFreeStack&amp;amp; ){}&lt;br&gt;  LockFreeStack&amp;amp; &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;operator&lt;/font&gt;&lt;/font&gt;=( &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;const&lt;/font&gt;&lt;/font&gt; LockFreeStack&amp;amp; ){}&lt;br&gt;};&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;&lt;br&gt;&lt;/font&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5300274535508806924&amp;page=RSS%3a+Two+versions+for+Lock-Free+Stack&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=fabiogaluppo.spaces.live.com&amp;amp;GT1=fabiogaluppo"&gt;</description><category>Concurrency</category><comments>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!178.entry#comment</comments><guid isPermaLink="true">http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!178.entry</guid><pubDate>Tue, 24 Jun 2008 11:09:06 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://fabiogaluppo.spaces.live.com/blog/cns!B671A4645AF2F2F4!178/comments/feed.rss</wfw:commentRss><wfw:comment>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!178.entry#comment</wfw:comment><dcterms:modified>2008-06-24T11:17:44Z</dcterms:modified></item><item><title>Samples from my Concurrency Talk at Seminário TempoReal C++ Portabilidade e Performance</title><link>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!176.entry</link><description>&lt;div&gt;  &lt;/div&gt;
&lt;div&gt;Samples from my Concurrency Talk at &lt;a href="http://www.temporealeventos.com.br/?area=101"&gt;Seminário TempoReal C++ Portabilidade e Performance&lt;/a&gt;:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://cid-b671a4645af2f2f4.skydrive.live.com/self.aspx/P%c3%bablico/Samples - Semin%c3%a1rio Tempo Real - C++ Portabilidade e Performance/Samples - Seminario TempoReal C++ Performance e Portabilidade.zip"&gt;Concurrency C++ Samples&lt;/a&gt;
&lt;li&gt;&lt;a href="http://cid-b671a4645af2f2f4.skydrive.live.com/self.aspx/P%c3%bablico/Samples - Semin%c3%a1rio Tempo Real - C++ Portabilidade e Performance/Programa%c3%a7%c3%a3o Concorrente com C++.pdf.zip"&gt;Concurrency C++ Slides&lt;/a&gt; (in brazilian portuguese)&lt;/ul&gt;
&lt;div&gt;The following code is a C++ port to one of my previous samples: &lt;a href="http://fabiogaluppo.spaces.live.com/blog/cns!B671A4645AF2F2F4!150.entry"&gt;MapReduce with Parallelspace&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;font color="#0000ff" size=2&gt;&lt;font color="#0000ff" size=2&gt;
&lt;div&gt;&lt;font size=1&gt;#include &lt;/font&gt;&lt;/div&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;lt;iostream&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;lt;fstream&amp;gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;lt;vector&amp;gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;lt;map&amp;gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;lt;string&amp;gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;lt;boost/thread/thread.hpp&amp;gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;lt;boost/thread/mutex.hpp&amp;gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;lt;boost/filesystem.hpp&amp;gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;lt;boost/function.hpp&amp;gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;lt;boost/algorithm/string.hpp&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; 
&lt;div&gt;&lt;font color="#a31515"&gt;&lt;font color="#a31515" size=1&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; std;&lt;/font&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; boost;&lt;/font&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; boost::filesystem;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; get_files( &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;const&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; path&amp;amp; directory, vector&amp;lt;path&amp;gt;&amp;amp; files )&lt;/font&gt; &lt;br&gt;{ &lt;br&gt;  directory_iterator end_iter; &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  for&lt;/font&gt;&lt;/font&gt;( directory_iterator iter( directory ); iter != end_iter; ++iter ) &lt;br&gt;  { &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;    if&lt;/font&gt;&lt;/font&gt;( is_directory( iter-&amp;gt;status() ) ) &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;continue&lt;/font&gt;&lt;/font&gt;; &lt;br&gt;    files.push_back( iter-&amp;gt;path() ); &lt;br&gt;  } &lt;br&gt;}&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;int&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; get_ProcessorCount(){ &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; 2; }&lt;/font&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; TaskExecutor&lt;/font&gt; &lt;br&gt;{ &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;typedef&lt;/font&gt;&lt;/font&gt; function2&amp;lt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/font&gt;, map&amp;lt;string, &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;&amp;amp;, &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;const&lt;/font&gt;&lt;/font&gt; map&amp;lt;string, &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;&amp;amp;&amp;gt; ConsolidationFunctionType; &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;typedef&lt;/font&gt;&lt;/font&gt; function1&amp;lt;map&amp;lt;string, &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;, &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;const&lt;/font&gt;&lt;/font&gt; path&amp;amp;&amp;gt; CountWordsFunctionType; &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt; &lt;br&gt;  TaskExecutor( vector&amp;lt;path&amp;gt;::const_iterator begin, vector&amp;lt;path&amp;gt;::const_iterator end, &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;                      const&lt;/font&gt;&lt;/font&gt; CountWordsFunctionType countWords, &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;                      const&lt;/font&gt;&lt;/font&gt; ConsolidationFunctionType consolidation, &lt;br&gt;                      map&amp;lt;string, &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;&amp;amp; result ) : Begin_( begin ), &lt;br&gt;                      End_( end ), &lt;br&gt;                      CountWordsFunction_( countWords ), &lt;br&gt;                      ConsolidationFunction_( consolidation ), &lt;br&gt;                      Result_( result ){} &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;br&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  void&lt;/font&gt;&lt;/font&gt; &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;operator&lt;/font&gt;&lt;/font&gt;()() &lt;br&gt;  { &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;    for&lt;/font&gt;&lt;/font&gt;( vector&amp;lt;path&amp;gt;::const_iterator iter = Begin_; iter != End_; ++iter ) &lt;br&gt;      ConsolidationFunction_( Result_, CountWordsFunction_( *iter ) ); &lt;br&gt;  }&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;private&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt;:&lt;/font&gt; &lt;br&gt;  vector&amp;lt;path&amp;gt;::const_iterator Begin_, End_; &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  const&lt;/font&gt;&lt;/font&gt; ConsolidationFunctionType ConsolidationFunction_; &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  const&lt;/font&gt;&lt;/font&gt; CountWordsFunctionType CountWordsFunction_; &lt;br&gt;  map&amp;lt;string, &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;&amp;amp; Result_; &lt;br&gt;};&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; key_count( map&amp;lt;string, &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&amp;amp; dictionary, &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;const&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; string&amp;amp; word, &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; value )&lt;/font&gt; &lt;br&gt;{ &lt;br&gt;  dictionary[ word ] = dictionary.end() != dictionary.find( word ) ? dictionary[ word ] + value : value; &lt;br&gt;}&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt; &lt;br&gt;map&amp;lt;string, &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt; map_function( &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;const&lt;/font&gt;&lt;/font&gt; path&amp;amp; filename ) &lt;br&gt;{ &lt;br&gt;  map&amp;lt;string, &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt; wordCount; &lt;br&gt;&lt;br&gt;  ifstream file; &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  const&lt;/font&gt;&lt;/font&gt; &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt; MAXLEN = 1024; &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  char&lt;/font&gt;&lt;/font&gt; line[ MAXLEN ]; &lt;br&gt;&lt;br&gt;  file.open( filename.directory_string().c_str() ); &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  while&lt;/font&gt;&lt;/font&gt;( file.getline( line, MAXLEN ) ) &lt;br&gt;  { &lt;br&gt;    vector&amp;lt;string&amp;gt; split_v; &lt;br&gt;    split( split_v, string( line ), is_any_of( &lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;quot; &amp;quot;&lt;/font&gt;&lt;/font&gt; ) ); &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;    for&lt;/font&gt;&lt;/font&gt;( vector&amp;lt;string&amp;gt;::const_iterator iter = split_v.begin(); iter != split_v.end(); ++iter ) &lt;br&gt;      key_count( wordCount, *iter, 1 ); &lt;br&gt;  } &lt;br&gt;  &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;  file.close(); &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  return&lt;/font&gt;&lt;/font&gt; wordCount; &lt;br&gt;}&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; reduce_function( map&amp;lt;string, &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&amp;amp; destination, &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;const&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; map&amp;lt;string, &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&amp;amp; source )&lt;/font&gt; &lt;br&gt;{ &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  for&lt;/font&gt;&lt;/font&gt;( map&amp;lt;string, &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;::const_iterator iter = source.begin(); iter != source.end(); ++iter ) &lt;br&gt;  key_count( destination, iter-&amp;gt;first, iter-&amp;gt;second ); &lt;br&gt;}&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; wordcount_mapreduced( &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;const&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; vector&amp;lt;path&amp;gt;&amp;amp; files, map&amp;lt;string, &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&amp;amp; wordCount )&lt;/font&gt; &lt;br&gt;{ &lt;br&gt;&lt;font color="#008000"&gt;&lt;font color="#008000"&gt;  //data partition &lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  int&lt;/font&gt;&lt;/font&gt; numberOfPartitions = get_ProcessorCount() * 2; &lt;font color="#008000"&gt;&lt;font color="#008000"&gt;//2 threads per core &lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  int&lt;/font&gt;&lt;/font&gt; numberOfFiles = &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;static_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;( files.size() ); &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  if&lt;/font&gt;&lt;/font&gt;( numberOfFiles &amp;lt; numberOfPartitions ) numberOfPartitions = numberOfFiles; &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  int&lt;/font&gt;&lt;/font&gt; delta = numberOfFiles / numberOfPartitions; &lt;br&gt;  vector&amp;lt; map&amp;lt;string, &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt; &amp;gt; result( numberOfPartitions ); &lt;br&gt;  thread_group tg; &lt;br&gt;&lt;font color="#008000"&gt;&lt;font color="#008000"&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;&lt;font color="#008000"&gt;&lt;font color="#008000"&gt;  //for parallel &lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  for&lt;/font&gt;&lt;/font&gt;( &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt; step = 0; step &amp;lt; numberOfPartitions; ++step ) &lt;br&gt;  { &lt;br&gt;    vector&amp;lt;path&amp;gt;::const_iterator begin = files.begin() + delta * step, &lt;br&gt;    end = numberOfPartitions - 1 == step ? files.end() : files.begin() + delta * step + delta; &lt;br&gt;&lt;font color="#008000"&gt;&lt;font color="#008000"&gt;    //fork &lt;/font&gt;&lt;/font&gt;&lt;br&gt;    tg.create_thread( TaskExecutor( begin, end, map_function, reduce_function, result[step] ) ); &lt;br&gt;  }&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt; &lt;br&gt;&lt;font color="#008000"&gt;&lt;font color="#008000"&gt;  //join &lt;/font&gt;&lt;/font&gt;&lt;br&gt;  tg.join_all(); &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  for&lt;/font&gt;&lt;/font&gt;( vector&amp;lt; map&amp;lt;string, &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt; &amp;gt;::const_iterator iter = result.begin(); iter != result.end(); ++iter ) &lt;br&gt;    reduce_function( wordCount, *iter ); &lt;br&gt;}&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;int&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; main()&lt;/font&gt; &lt;br&gt;{ &lt;br&gt;  vector&amp;lt;path&amp;gt; files; &lt;br&gt;  get_files( &lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;quot;c:\\txttest\\&amp;quot;&lt;/font&gt;&lt;/font&gt;, files ); &lt;br&gt;  map&amp;lt;string, &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt; wordCount; &lt;br&gt;&lt;br&gt;  wordcount_mapreduced( files, wordCount ); &lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;  for&lt;/font&gt;&lt;/font&gt;( map&amp;lt;string, &lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;::const_iterator iter = wordCount.begin(); iter != wordCount.end(); ++iter ) &lt;br&gt;    cout &amp;lt;&amp;lt; iter-&amp;gt;first &amp;lt;&amp;lt; &lt;font color="#a31515"&gt;&lt;font color="#a31515"&gt;&amp;quot; = &amp;quot;&lt;/font&gt;&lt;/font&gt; &amp;lt;&amp;lt; iter-&amp;gt;second &amp;lt;&amp;lt; endl; &lt;br&gt;}&lt;/font&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5300274535508806924&amp;page=RSS%3a+Samples+from+my+Concurrency+Talk+at+Semin%c3%a1rio+TempoReal+C%2b%2b+Portabilidade+e+Performance&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=fabiogaluppo.spaces.live.com&amp;amp;GT1=fabiogaluppo"&gt;</description><category>C++</category><comments>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!176.entry#comment</comments><guid isPermaLink="true">http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!176.entry</guid><pubDate>Fri, 13 Jun 2008 13:11:13 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://fabiogaluppo.spaces.live.com/blog/cns!B671A4645AF2F2F4!176/comments/feed.rss</wfw:commentRss><wfw:comment>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!176.entry#comment</wfw:comment><dcterms:modified>2008-06-13T13:19:48Z</dcterms:modified></item><item><title>Get the size of directories from all drives with F#</title><link>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!165.entry</link><description>&lt;div&gt; &lt;/div&gt;
&lt;div&gt;This small F# utility uses recursion to inspect all directories from all drives installed (including network drives mapped).&lt;/div&gt;
&lt;div&gt;The sizes are printed in the console screen (or could be redirected).&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;#light&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;open&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; System.IO&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;open&lt;/font&gt;&lt;font color="#000000"&gt; System&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;let&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; ConvertTo (n:int64) (d:float) = n / Convert.ToInt64( d )&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#008000"&gt;//let ConvertToMegabytes (n:int64) = ConvertTo n (1024.0 ** 2.0)&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;let&lt;/font&gt;&lt;font color="#000000"&gt; ConvertToKilobytes (n:int64) = ConvertTo n 1024.0&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;let&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;rec&lt;/font&gt;&lt;font color="#000000"&gt; getSizeOfDir (path:string) =&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;    let&lt;/font&gt; getSizeOfFiles (dir:string) =&lt;br&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;        try&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;DirectoryInfo(dir).GetFiles() |&amp;gt; Seq.sumByInt64( &lt;font color="#0000ff"&gt;fun&lt;/font&gt; file &lt;font color="#0000ff"&gt;-&amp;gt;&lt;/font&gt; file.Length )&lt;br&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;        with&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;| :? UnauthorizedAccessException &lt;font color="#0000ff"&gt;-&amp;gt;&lt;/font&gt; 0L;&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;    try&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;        let&lt;/font&gt; size = (Directory.GetDirectories( path ) |&amp;gt; Seq.sumByInt64( &lt;font color="#0000ff"&gt;fun&lt;/font&gt; dir &lt;font color="#0000ff"&gt;-&amp;gt;&lt;/font&gt; getSizeOfDir( dir ) )) + getSizeOfFiles( path )&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;printfn &lt;font color="#a31515"&gt;&amp;quot;Path = %s\r\nSize = %d KB (%d bytes)\r\n&amp;quot;&lt;/font&gt; path (ConvertToKilobytes size) size&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;size&lt;br&gt;&lt;font color="#0000ff"&gt;    with&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;| :? UnauthorizedAccessException &lt;font color="#0000ff"&gt;-&amp;gt;&lt;/font&gt; 0L&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;| :? IOException &lt;font color="#0000ff"&gt;-&amp;gt;&lt;/font&gt; 0L;&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;let&lt;/font&gt;&lt;font color="#000000"&gt; main = &lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;    let&lt;/font&gt; sw = &lt;font color="#0000ff"&gt;new&lt;/font&gt; Diagnostics.Stopwatch()&lt;br&gt;&lt;font color="#0000ff"&gt;    let&lt;/font&gt; tm = DateTime.Now&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;sw.Start()&lt;br&gt;    DriveInfo.GetDrives() |&amp;gt; Seq.iter( &lt;font color="#0000ff"&gt;fun&lt;/font&gt; drv &lt;font color="#0000ff"&gt;-&amp;gt;&lt;/font&gt; getSizeOfDir drv.Name |&amp;gt; ignore )&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;sw.Stop()&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;printfn &lt;font color="#a31515"&gt;&amp;quot;\r\n\r\nElapsed time = %s&amp;quot;&lt;/font&gt; (sw.Elapsed.ToString())&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;&lt;/font&gt; &lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;&lt;/font&gt; &lt;/div&gt;
&lt;div&gt;This utility could run better if reworked to support threads. Maybe next time... &lt;img title="Com sono" style="vertical-align:middle" alt="Com sono" src="http://shared.live.com/HjKMzTS-xzcms40!CabizA/emoticons/smile_yawn.gif"&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5300274535508806924&amp;page=RSS%3a+Get+the+size+of+directories+from+all+drives+with+F%23&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=fabiogaluppo.spaces.live.com&amp;amp;GT1=fabiogaluppo"&gt;</description><category>F#</category><comments>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!165.entry#comment</comments><guid isPermaLink="true">http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!165.entry</guid><pubDate>Mon, 25 Feb 2008 14:48:24 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://fabiogaluppo.spaces.live.com/blog/cns!B671A4645AF2F2F4!165/comments/feed.rss</wfw:commentRss><wfw:comment>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!165.entry#comment</wfw:comment><dcterms:modified>2008-02-25T14:48:24Z</dcterms:modified></item><item><title>XNA, Visual C++ and Guitar Hero</title><link>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!154.entry</link><description>&lt;font color="#0000ff"&gt;&lt;/font&gt;&lt;br&gt;Is it possible to write XNA programs with Visual C++? Yes, it is! Someone show that is &lt;a href="http://blogs.msdn.com/dsyme/archive/2006/12/12/writing-xbox-360-games-with-f-and-xna-game-studio-express-courtesy-of-jack-palevich.aspx"&gt;possible in F#&lt;/a&gt;, too.&lt;br&gt;&lt;br&gt;The &lt;a href="http://creators.xna.com/Education/GettingStarted.aspx"&gt;XNA Game Studio 2.0&lt;/a&gt; can be installed inside Visual Studio 2005 Professional (the previous version is hosted only in VC# Express).&lt;br&gt;&lt;br&gt;The sample below is a Guitar Hero Panel. You plug-in a guitar on PC, and press Fret buttons, Strum bar and Whammy bar to see the feedback. (This sample doesn´t have sounds, just visual feedback)&lt;br&gt;&lt;br&gt;&lt;a href="http://byfiles.storage.live.com/y1prdFtt9jepe5gsqMIO5j8MZYleoaR8NiaNR3WjMQsCYa8TpyNZt-51PbfKxz6yA1N822FVH7i2sU" target="_blank"&gt;&lt;img style="width:667px;height:232px" height=232 alt=GHP src="http://byfiles.storage.live.com/y1prdFtt9jepe5gsqMIO5j8MZYleoaR8NiaNR3WjMQsCYa8TpyNZt-51PbfKxz6yA1N822FVH7i2sU" width=667&gt;&lt;/a&gt;&lt;a href="http://byfiles.storage.live.com/y1prdFtt9jepe4rQa8x4SbiP5KxtPa4ra2TLl1GNcrKlgnobWeehQI8swaYPDs4i2Hq0me5tbEJF4s" target="_blank"&gt;&lt;/a&gt;&lt;br&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;How can you do to write your own XNA programs with Visual C++?&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;1. Create a XNA Windows Game (or XNA Xbox 360 Game) project with C#. (C# will be the host of the C++/CLI dll. C# is necessary to compile Game Assets like images, fonts, ...)&lt;/div&gt;
&lt;div&gt;2. Add a new project Visual C++ CLR Class Library into the current solution. The XNA program will be coded entirely in C++/CLI, here. Is very important (if you want to port to Xbox 360) to compile this project with /clr:safe switch. This ensure that the generated code is MSIL-only. Add reference to the assemblies: Microsoft.Xna.Framework.dll and Microsoft.Xna.Framework.Game.dll. They are at Microsoft XNA install dir something like: &amp;lt;XNA install dir&amp;gt;\XNA Game Studio\v2.0\References\Windows\x86\&lt;/div&gt;
&lt;div&gt;3. Add a reference to the VC++ CLR DLL in the C# project. And call the game class written in C++/CLI, at Main method in C# code. (You even have the ability to debug step-by-step) &lt;img title=Surpreso style="vertical-align:middle" alt=Surpreso src="http://shared.live.com/HjKMzTS-xzcms40!CabizA/emoticons/smile_omg.gif"&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The following code is the C++/CLI game program. If you look with attention you see that &lt;u&gt;we have templates and stack semantics&lt;/u&gt;:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;font color="#0000ff" size=2&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;namespace&lt;/font&gt;&lt;font color="#000000"&gt; Microsoft::Xna::Framework;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;namespace&lt;/font&gt;&lt;font color="#000000"&gt; Microsoft::Xna::Framework::Graphics;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;namespace&lt;/font&gt;&lt;font color="#000000"&gt; Microsoft::Xna::Framework::Input;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000" size=1&gt; GuitarHeroControlPanel&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;{&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;ref struct&lt;/font&gt; Piece&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;{&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    Piece( Texture2D^ image, Vector2 position, SpriteBatch^ spriteBatch ) : &lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    Display_( &lt;font color="#0000ff"&gt;false &lt;/font&gt;), Image_( image ), Position_( position ), SpriteBatch_( spriteBatch ){}&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;    &lt;font color="#0000ff"&gt;void&lt;/font&gt; Update( &lt;font color="#0000ff"&gt;bool&lt;/font&gt; displayStatus ){ Display_ = displayStatus; }&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    &lt;font color="#0000ff"&gt;void&lt;/font&gt; Draw()&lt;/font&gt;&lt;font size=1&gt;{ &lt;/font&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;( Display_ ) SpriteBatch_-&amp;gt;Draw( Image_, Position_, Color::White ); &lt;/font&gt;&lt;font size=1&gt;}&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;:&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    &lt;font color="#0000ff"&gt;bool&lt;/font&gt; Display_;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    Vector2 Position_;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    Texture2D^ Image_;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    SpriteBatch^ SpriteBatch_;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;};&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;public ref class&lt;/font&gt; GuitarHeroControlPanel : Game&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;{&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;:&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    GuitarHeroControlPanel()&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    {&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        Graphics_ = &lt;font color="#0000ff"&gt;gcnew &lt;/font&gt;GraphicsDeviceManager(&lt;font color="#0000ff"&gt;this&lt;/font&gt;);&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        Graphics_-&amp;gt;PreferredBackBufferWidth = 1280;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        Graphics_-&amp;gt;PreferredBackBufferHeight = 416;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        Window-&amp;gt;Title = &lt;font color="#ff0000"&gt;&amp;quot;Guitar Hero Panel by Fabio Galuppo. Implemented with XNA and Visual C++ 2005. Visit: http://www.gamecultura.com.br/. Blog: http://fabiogaluppo.spaces.live.com/&amp;quot;&lt;/font&gt;;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        Content-&amp;gt;RootDirectory = &lt;font color="#ff0000"&gt;&amp;quot;Content&amp;quot;&lt;/font&gt;;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;}&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;:&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    &lt;font color="#0000ff"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;class&lt;/font&gt; T&amp;gt; T^ CntLoad( System::String^ assetName ){ &lt;font color="#0000ff"&gt;return&lt;/font&gt; Content-&amp;gt;Load&amp;lt;T^&amp;gt;( assetName ); }&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    &lt;font color="#0000ff"&gt;template&lt;/font&gt;&amp;lt;PlayerIndex P&amp;gt; GamePadButtons GetButtons(){ &lt;font color="#0000ff"&gt;return&lt;/font&gt; GamePad::GetState(P).Buttons; }&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    &lt;font color="#0000ff"&gt;template&lt;/font&gt;&amp;lt;PlayerIndex P&amp;gt; GamePadDPad GetDPad(){ &lt;font color="#0000ff"&gt;return&lt;/font&gt; GamePad::GetState(P).DPad; }&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    &lt;font color="#0000ff"&gt;template&lt;/font&gt;&amp;lt;PlayerIndex P&amp;gt; GamePadThumbSticks GetThumbSticks(){ &lt;font color="#0000ff"&gt;return&lt;/font&gt; GamePad::GetState(P).ThumbSticks; }&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    &lt;font color="#0000ff"&gt;bool&lt;/font&gt; IsPressed( ButtonState bs ){ &lt;font color="#0000ff"&gt;return&lt;/font&gt; bs == ButtonState::Pressed; }&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;:&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    &lt;font color="#0000ff"&gt;virtual void &lt;/font&gt;LoadContent() &lt;font color="#0000ff"&gt;override&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;    {&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        SpriteBatch_ = &lt;font color="#0000ff"&gt;gcnew&lt;/font&gt; SpriteBatch(GraphicsDevice);&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        Font_ = CntLoad&amp;lt;SpriteFont&amp;gt;( &amp;quot;Tahoma&amp;quot; );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        GuitarTexture_ = CntLoad&amp;lt;Texture2D&amp;gt;( &amp;quot;guitarhero&amp;quot; );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        GCLogo_ = CntLoad&amp;lt;Texture2D&amp;gt;( &amp;quot;gclogo&amp;quot; );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        VCLogo_ = CntLoad&amp;lt;Texture2D&amp;gt;( &amp;quot;vclogo&amp;quot; );&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;        GreenFret_ = &lt;font color="#0000ff"&gt;gcnew&lt;/font&gt; Piece( CntLoad&amp;lt;Texture2D&amp;gt;( &lt;font color="#ff0000"&gt;&amp;quot;green&amp;quot; &lt;/font&gt;), Vector2(965.0, 0.0), SpriteBatch_ );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        RedFret_ = &lt;font color="#0000ff"&gt;gcnew&lt;/font&gt; Piece( CntLoad&amp;lt;Texture2D&amp;gt;( &lt;font color="#ff0000"&gt;&amp;quot;red&amp;quot;&lt;/font&gt; ), Vector2(930.0, 0.0), SpriteBatch_ );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        YellowFret_ = &lt;font color="#0000ff"&gt;gcnew&lt;/font&gt; Piece( CntLoad&amp;lt;Texture2D&amp;gt;( &lt;font color="#ff0000"&gt;&amp;quot;yellow&amp;quot; &lt;/font&gt;), Vector2(895.0, 0.0), SpriteBatch_ );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        BlueFret_ = &lt;font color="#0000ff"&gt;gcnew&lt;/font&gt; Piece( CntLoad&amp;lt;Texture2D&amp;gt;( &lt;font color="#ff0000"&gt;&amp;quot;blue&amp;quot;&lt;/font&gt; ), Vector2(858.0, 0.0), SpriteBatch_ );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        OrangeFret_ = &lt;font color="#0000ff"&gt;gcnew&lt;/font&gt; Piece( CntLoad&amp;lt;Texture2D&amp;gt;( &lt;font color="#ff0000"&gt;&amp;quot;orange&amp;quot;&lt;/font&gt; ), Vector2(821.0, 0.0), SpriteBatch_ );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        Strum_ = &lt;font color="#0000ff"&gt;gcnew&lt;/font&gt; Piece( CntLoad&amp;lt;Texture2D&amp;gt;( &lt;font color="#ff0000"&gt;&amp;quot;strum&amp;quot;&lt;/font&gt; ), Vector2(269.0, 0.0), SpriteBatch_ );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        Whammy_ = &lt;font color="#0000ff"&gt;gcnew&lt;/font&gt; Piece( CntLoad&amp;lt;Texture2D&amp;gt;( &lt;font color="#ff0000"&gt;&amp;quot;whammy&amp;quot;&lt;/font&gt; ), Vector2(0.0, 259.0), SpriteBatch_ );&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;        GCLogoVec_ = Vector2( 895.0 , 0.0 );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        VCLogoVecPos_ = Vector2( 250.0, 130.0 ); &lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        VCLogoVecOri_ = Vector2( VCLogo_-&amp;gt;Width / 2.0f, VCLogo_-&amp;gt;Height / 2.0f );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        FontVec_ = Vector2( 880.0, 380.0 ); &lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    }&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;    &lt;font color="#0000ff"&gt;virtual void&lt;/font&gt; Update(GameTime^ gameTime) &lt;font color="#0000ff"&gt;override &lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    {&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        &lt;font color="#0000ff"&gt;if &lt;/font&gt;( IsPressed( GetButtons&amp;lt;PlayerIndex::One&amp;gt;().Back ) ) Game::Exit();&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="#008000"&gt;&lt;font size=1&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;//Fret Buttons&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;font size=1&gt;        GreenFret_-&amp;gt;Update( IsPressed( GetButtons&amp;lt;PlayerIndex::One&amp;gt;().A ) );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        RedFret_-&amp;gt;Update( IsPressed( GetButtons&amp;lt;PlayerIndex::One&amp;gt;().B ) );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        YellowFret_-&amp;gt;Update( IsPressed( GetButtons&amp;lt;PlayerIndex::One&amp;gt;().Y ) );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        BlueFret_-&amp;gt;Update( IsPressed( GetButtons&amp;lt;PlayerIndex::One&amp;gt;().X ) );&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        OrangeFret_-&amp;gt;Update( IsPressed( GetButtons&amp;lt;PlayerIndex::One&amp;gt;().LeftShoulder ) );&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="#008000"&gt;&lt;font size=1&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;//Strum Bar&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;font size=1&gt;        Strum_-&amp;gt;Update( IsPressed( GetDPad&amp;lt;PlayerIndex::One&amp;gt;().Up ) || IsPressed( GetDPad&amp;lt;PlayerIndex::One&amp;gt;().Down ) );&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="#008000"&gt;&lt;font size=1&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;//Whammy Bar&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;font size=1&gt;        Whammy_-&amp;gt;Update( GetThumbSticks&amp;lt;PlayerIndex::One&amp;gt;().Right.X &amp;gt;= 0.0 );&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;        Game::Update(gameTime);&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    }&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;    &lt;/font&gt;virtual&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; Draw(GameTime^ gameTime) &lt;font color="#0000ff"&gt;override&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;    {&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        Graphics_-&amp;gt;GraphicsDevice-&amp;gt;Clear(Color::CornflowerBlue);&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;        Game::Draw(gameTime);&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;        SpriteBatch_-&amp;gt;Begin();&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;            SpriteBatch_-&amp;gt;Draw( GuitarTexture_, Vector2::Zero, Color::White );&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;            GreenFret_-&amp;gt;Draw();&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;            RedFret_-&amp;gt;Draw();&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;            YellowFret_-&amp;gt;Draw();&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;            BlueFret_-&amp;gt;Draw();&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;            OrangeFret_-&amp;gt;Draw();&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;            Strum_-&amp;gt;Draw();&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;            Whammy_-&amp;gt;Draw();&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;            SpriteBatch_-&amp;gt;Draw( GCLogo_, GCLogoVec_, Color::White ); &lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;            SpriteBatch_-&amp;gt;Draw( VCLogo_, VCLogoVecPos_, NullRect_, Color::White, -45.0, VCLogoVecOri_, 1.0, SpriteEffects::None, 0.0 );&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;            SpriteBatch_-&amp;gt;DrawString( Font_, &lt;font color="#a31515"&gt;&amp;quot;http://fabiogaluppo.spaces.live.com/&amp;quot;&lt;/font&gt;, FontVec_, Color::Black );&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;        SpriteBatch_-&amp;gt;End();&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    }&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;:&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    GraphicsDeviceManager^ Graphics_;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    SpriteBatch^ SpriteBatch_;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    Texture2D ^GuitarTexture_, ^GCLogo_, ^VCLogo_;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    Vector2 GCLogoVec_, VCLogoVecPos_, VCLogoVecOri_, FontVec_;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    System::Nullable&amp;lt;Rectangle&amp;gt; NullRect_;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    SpriteFont^ Font_;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    Piece ^GreenFret_, ^RedFret_, ^YellowFret_, ^BlueFret_, ^OrangeFret_, ^Strum_, ^Whammy_;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;};&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;};&lt;/font&gt;&lt;br&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The C# host program:&lt;/div&gt;
&lt;div&gt;&lt;font color="#0000ff" size=2&gt;&lt;/font&gt; &lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;font color="#000000"&gt; System;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000" size=1&gt; GuitarHeroControlPanel&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;{&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;class&lt;/font&gt; &lt;font color="#2b91af"&gt;Program&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;{&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;    static&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; Main()&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    {&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;        using&lt;/font&gt; (&lt;font color="#2b91af"&gt;GuitarHeroControlPanel&lt;/font&gt; panel = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;GuitarHeroControlPanel&lt;/font&gt;()) &lt;/font&gt;&lt;font size=1&gt;panel.Run();&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;    }&lt;/font&gt;&lt;br&gt;&lt;font size=1&gt;}&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size=1&gt;}&lt;/font&gt;&lt;br&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.gamecultura.com.br/~dev/GuitarHeroPanel.rar"&gt;Download the solution to GHP&lt;/a&gt; &lt;/div&gt;
&lt;div&gt;Do you like games? Stay tuned at &lt;a href="http://www.gamecultura.com.br/"&gt;GameCultura&lt;/a&gt;   &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5300274535508806924&amp;page=RSS%3a+XNA%2c+Visual+C%2b%2b+and+Guitar+Hero&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=fabiogaluppo.spaces.live.com&amp;amp;GT1=fabiogaluppo"&gt;</description><category>C++</category><comments>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!154.entry#comment</comments><guid isPermaLink="true">http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!154.entry</guid><pubDate>Thu, 07 Feb 2008 11:43:13 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://fabiogaluppo.spaces.live.com/blog/cns!B671A4645AF2F2F4!154/comments/feed.rss</wfw:commentRss><wfw:comment>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!154.entry#comment</wfw:comment><dcterms:modified>2008-02-07T12:46:20Z</dcterms:modified></item><item><title>TechEd Brasil 2007 - TxF Demo #5</title><link>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!153.entry</link><description>&lt;div&gt; &lt;/div&gt;
&lt;div&gt;How to consume &lt;a href="http://fabiogaluppo.spaces.live.com/blog/cns!B671A4645AF2F2F4!152.entry"&gt;the TxF wrapper&lt;/a&gt; with C#:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;font color="#000000"&gt; System;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;font color="#000000"&gt; System.Transactions;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;font color="#000000"&gt; System.IO;&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt; &lt;/font&gt;&lt;font size=1&gt;&lt;font color="#2b91af"&gt;Program&lt;br&gt;&lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;    static&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; Main(&lt;font color="#0000ff"&gt;string&lt;/font&gt;[] args)&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;        using&lt;/font&gt; (&lt;font color="#2b91af"&gt;TransactionScope&lt;/font&gt; scope = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;TransactionScope&lt;/font&gt;())&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;            using&lt;/font&gt; (&lt;font color="#2b91af"&gt;StreamWriter&lt;/font&gt; sw = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;StreamWriter&lt;/font&gt;(NTFS.Transactional.&lt;font color="#2b91af"&gt;File&lt;/font&gt;.OpenTransacted(&lt;font color="#a31515"&gt;&amp;quot;c:\\ManagedNTFSTx.txt&amp;quot;&lt;/font&gt;, &lt;font color="#2b91af"&gt;FileMode&lt;/font&gt;.OpenOrCreate, &lt;font color="#2b91af"&gt;FileAccess&lt;/font&gt;.Write, &lt;font color="#2b91af"&gt;FileShare&lt;/font&gt;.None)))&lt;font color="#0000ff"&gt;            &lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;                for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = 0; i &amp;lt; 1000; ++i) sw.WriteLine(&lt;font color="#a31515"&gt;&amp;quot;Hello World&amp;quot;&lt;/font&gt;);&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;scope.Complete(); &lt;font color="#00b050"&gt;//omit this line to rollback transaction&lt;/font&gt; &lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;}&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;        using&lt;/font&gt; (&lt;font color="#2b91af"&gt;TransactionScope&lt;/font&gt; scope = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;TransactionScope&lt;/font&gt;())&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;NTFS.Transactional.&lt;font color="#2b91af"&gt;File&lt;/font&gt;.CopyTransacted(&lt;font color="#a31515"&gt;&amp;quot;c:\\ManagedNTFSTx.txt&amp;quot;&lt;/font&gt;, &lt;font color="#a31515"&gt;&amp;quot;c:\\ManagedNTFSTxClone.txt&amp;quot;&lt;/font&gt;, &lt;font color="#0000ff"&gt;true&lt;/font&gt;);&lt;br&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;scope.Complete(); &lt;font color="#00b050"&gt;//omit this line to rollback transaction&lt;/font&gt; &lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;}&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;}&lt;br&gt;}&lt;/font&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5300274535508806924&amp;page=RSS%3a+TechEd+Brasil+2007+-+TxF+Demo+%235&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=fabiogaluppo.spaces.live.com&amp;amp;GT1=fabiogaluppo"&gt;</description><category>Windows SDK</category><comments>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!153.entry#comment</comments><guid isPermaLink="true">http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!153.entry</guid><pubDate>Thu, 03 Jan 2008 13:12:02 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://fabiogaluppo.spaces.live.com/blog/cns!B671A4645AF2F2F4!153/comments/feed.rss</wfw:commentRss><wfw:comment>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!153.entry#comment</wfw:comment><dcterms:modified>2008-01-03T13:13:38Z</dcterms:modified></item><item><title>TechEd Brasil 2007 - TxF Demo #4</title><link>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!152.entry</link><description>&lt;div&gt; &lt;/div&gt;
&lt;div&gt;This managed wrapper is inspired/adapted/improved from &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/07/NTFS/default.aspx"&gt;this article&lt;/a&gt;. &lt;/div&gt;
&lt;div&gt;It supports some NTFS transactional file operations like copy, delete, create and open. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;font color="#0000ff" size=2&gt;
&lt;div&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/div&gt;&lt;/font&gt;&lt;font color="#000000" size=1&gt; System;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000" size=1&gt; System.IO;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000" size=1&gt; System.Security;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000" size=1&gt; System.Runtime.InteropServices;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000" size=1&gt; System.Runtime.ConstrainedExecution;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000" size=1&gt; System.Runtime.CompilerServices;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000" size=1&gt; Microsoft.Win32.SafeHandles;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; System.Transactions;&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; NTFS.Transactional&lt;/font&gt;&lt;br&gt;{&lt;br&gt;    [&lt;font color="#2b91af"&gt;ComImport&lt;/font&gt;, &lt;font color="#2b91af"&gt;Guid&lt;/font&gt;(&lt;font color="#a31515"&gt;&amp;quot;79427A2B-F895-40e0-BE79-B57DC82ED231&amp;quot;&lt;/font&gt;), &lt;font color="#2b91af"&gt;InterfaceType&lt;/font&gt;(&lt;font color="#2b91af"&gt;ComInterfaceType&lt;/font&gt;.InterfaceIsIUnknown)]&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;    &lt;/font&gt;interface&lt;/font&gt; &lt;font color="#2b91af"&gt;IKernelTransaction&lt;/font&gt;&lt;br&gt;    {&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;int&lt;/font&gt; GetHandle(&lt;font color="#0000ff"&gt;out&lt;/font&gt; &lt;font color="#2b91af"&gt;IntPtr&lt;/font&gt; pHandle);&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    [&lt;font color="#2b91af"&gt;SuppressUnmanagedCodeSecurity&lt;/font&gt;]&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;    &lt;/font&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;class&lt;/font&gt; &lt;/font&gt;&lt;font size=1&gt;&lt;font color="#2b91af"&gt;WindowsAPI&lt;br&gt;&lt;/font&gt;    {&lt;br&gt;        [&lt;font color="#2b91af"&gt;DllImport&lt;/font&gt;(&lt;font color="#a31515"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/font&gt;, SetLastError = &lt;font color="#0000ff"&gt;true&lt;/font&gt;)]&lt;br&gt;        [&lt;font color="#2b91af"&gt;ReliabilityContract&lt;/font&gt;(&lt;font color="#2b91af"&gt;Consistency&lt;/font&gt;.WillNotCorruptState, &lt;font color="#2b91af"&gt;Cer&lt;/font&gt;.Success)]&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;extern&lt;/font&gt; &lt;font color="#0000ff"&gt;bool&lt;/font&gt; CloseHandle(&lt;font color="#2b91af"&gt;IntPtr&lt;/font&gt; hObject);&lt;br&gt;&lt;br&gt;        [&lt;font color="#2b91af"&gt;DllImport&lt;/font&gt;(&lt;font color="#a31515"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/font&gt;, CharSet = &lt;font color="#2b91af"&gt;CharSet&lt;/font&gt;.Auto, SetLastError = &lt;font color="#0000ff"&gt;true&lt;/font&gt;)]&lt;br&gt;        [&lt;font color="#2b91af"&gt;ReliabilityContract&lt;/font&gt;(&lt;font color="#2b91af"&gt;Consistency&lt;/font&gt;.WillNotCorruptState, &lt;font color="#2b91af"&gt;Cer&lt;/font&gt;.MayFail)]&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;extern&lt;/font&gt; &lt;font color="#2b91af"&gt;SafeFileHandle&lt;/font&gt; CreateFileTransacted&lt;br&gt;        (&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;string&lt;/font&gt; lpFileName,&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;Constants&lt;/font&gt;.&lt;font color="#2b91af"&gt;FileAccess&lt;/font&gt; dwDesiredAccess,&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;Constants&lt;/font&gt;.&lt;font color="#2b91af"&gt;FileShare&lt;/font&gt; dwShareMode,&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;IntPtr&lt;/font&gt; lpSecurityAttributes,&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;Constants&lt;/font&gt;.&lt;font color="#2b91af"&gt;FileMode&lt;/font&gt; dwCreationDisposition,&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;int&lt;/font&gt; dwFlagsAndAttributes,&lt;br&gt;            &lt;font color="#2b91af"&gt;IntPtr&lt;/font&gt; hTemplateFile,&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;IntPtr&lt;/font&gt; hTransaction,&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;IntPtr&lt;/font&gt; pusMiniVersion,&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;IntPtr&lt;/font&gt; pExtendedParameter&lt;br&gt;        );&lt;br&gt;&lt;br&gt;        [&lt;font color="#2b91af"&gt;DllImport&lt;/font&gt;(&lt;font color="#a31515"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/font&gt;, CharSet = &lt;font color="#2b91af"&gt;CharSet&lt;/font&gt;.Auto, SetLastError = &lt;font color="#0000ff"&gt;true&lt;/font&gt;)]&lt;br&gt;        [&lt;font color="#2b91af"&gt;ReliabilityContract&lt;/font&gt;(&lt;font color="#2b91af"&gt;Consistency&lt;/font&gt;.WillNotCorruptState, &lt;font color="#2b91af"&gt;Cer&lt;/font&gt;.MayFail)]&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;extern&lt;/font&gt; &lt;font color="#0000ff"&gt;bool&lt;/font&gt; CopyFileTransacted&lt;br&gt;        (&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;string&lt;/font&gt; lpExistingFileName,&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;string&lt;/font&gt; lpNewFileName,    &lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;IntPtr&lt;/font&gt; lpProgressRoutine,&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;IntPtr&lt;/font&gt; lpData,    &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;ref&lt;/font&gt; &lt;font color="#0000ff"&gt;bool&lt;/font&gt; pbCancel,&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;Constants&lt;/font&gt;.&lt;font color="#2b91af"&gt;CopyFile&lt;/font&gt; dwCopyFlags,&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;IntPtr&lt;/font&gt; hTransaction&lt;br&gt;        );&lt;br&gt;&lt;br&gt;        [&lt;font color="#2b91af"&gt;DllImport&lt;/font&gt;(&lt;font color="#a31515"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/font&gt;, CharSet = &lt;font color="#2b91af"&gt;CharSet&lt;/font&gt;.Auto, SetLastError = &lt;font color="#0000ff"&gt;true&lt;/font&gt;)]&lt;br&gt;        [&lt;font color="#2b91af"&gt;ReliabilityContract&lt;/font&gt;(&lt;font color="#2b91af"&gt;Consistency&lt;/font&gt;.WillNotCorruptState, &lt;font color="#2b91af"&gt;Cer&lt;/font&gt;.MayFail)]&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;extern&lt;/font&gt; &lt;font color="#0000ff"&gt;bool&lt;/font&gt; DeleteFileTransacted&lt;br&gt;        (&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;string&lt;/font&gt; file, &lt;font color="#2b91af"&gt;IntPtr&lt;/font&gt; transaction&lt;br&gt;        );&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;bool&lt;/font&gt; SUCCEDDED(&lt;font color="#0000ff"&gt;int&lt;/font&gt; hr) { &lt;font color="#0000ff"&gt;return&lt;/font&gt; hr == &lt;font color="#2b91af"&gt;Constants&lt;/font&gt;.ERROR_SUCCESS; }&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; ThrowsLastError() { &lt;font color="#0000ff"&gt;throw&lt;/font&gt; &lt;font color="#0000ff"&gt;new&lt;/font&gt; System.ComponentModel.&lt;font color="#2b91af"&gt;Win32Exception&lt;/font&gt;(&lt;font color="#2b91af"&gt;Marshal&lt;/font&gt;.GetLastWin32Error()); }&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;class&lt;/font&gt; &lt;/font&gt;&lt;font size=1&gt;&lt;font color="#2b91af"&gt;Constants&lt;br&gt;&lt;/font&gt;        {&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;const&lt;/font&gt; &lt;font color="#0000ff"&gt;int&lt;/font&gt; ERROR_SUCCESS = 0x0;&lt;br&gt;&lt;br&gt;            [&lt;font color="#2b91af"&gt;Flags&lt;/font&gt;]&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;enum&lt;/font&gt; &lt;font color="#2b91af"&gt;FileAccess&lt;/font&gt;&lt;br&gt;            {&lt;br&gt;                GENERIC_READ = &lt;font color="#0000ff"&gt;unchecked&lt;/font&gt;((&lt;font color="#0000ff"&gt;int&lt;/font&gt;)0x80000000),&lt;br&gt;                GENERIC_WRITE = 0x40000000&lt;br&gt;            }&lt;br&gt;&lt;br&gt;            [&lt;font color="#2b91af"&gt;Flags&lt;/font&gt;]&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;enum&lt;/font&gt; &lt;/font&gt;&lt;font size=1&gt;&lt;font color="#2b91af"&gt;FileShare&lt;br&gt;&lt;/font&gt;            {&lt;br&gt;                FILE_SHARE_NONE = 0x0,&lt;br&gt;                FILE_SHARE_READ = 0x1,&lt;br&gt;                FILE_SHARE_WRITE = 0x2,&lt;br&gt;                FILE_SHARE_DELETE = 0x4&lt;br&gt;            }&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;enum&lt;/font&gt; &lt;font color="#2b91af"&gt;FileMode&lt;/font&gt;&lt;br&gt;            {&lt;br&gt;                CREATE_NEW = 0x1,&lt;br&gt;                CREATE_ALWAYS = 0x2,&lt;br&gt;                OPEN_EXISTING = 0x3,&lt;br&gt;                OPEN_ALWAYS = 0x4,&lt;br&gt;                TRUNCATE_EXISTING = 0x5&lt;br&gt;            }&lt;br&gt;&lt;br&gt;            [&lt;font color="#2b91af"&gt;Flags&lt;/font&gt;]&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;enum&lt;/font&gt; &lt;font color="#2b91af"&gt;CopyFile&lt;/font&gt;&lt;br&gt;            {&lt;br&gt;                COPY_FILE_FAIL_IF_EXISTS = 0x1,&lt;br&gt;                COPY_FILE_RESTARTABLE = 0x2,&lt;br&gt;                COPY_FILE_OPEN_SOURCE_FOR_WRITE = 0x4,&lt;br&gt;                COPY_FILE_ALLOW_DECRYPTED_DESTINATION = 0x8,&lt;br&gt;                COPY_FILE_COPY_SYMLINK = 0x800&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;    &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;class&lt;/font&gt; &lt;font color="#2b91af"&gt;File&lt;/font&gt;&lt;br&gt;    {&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; DeleteTransacted(&lt;font color="#0000ff"&gt;string&lt;/font&gt; path)&lt;br&gt;        {&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;using&lt;/font&gt; (&lt;font color="#2b91af"&gt;KernelTransactionHandle&lt;/font&gt; transactionHandle = &lt;font color="#2b91af"&gt;KernelTransactionHandle&lt;/font&gt;.Get())&lt;br&gt;                &lt;font color="#0000ff"&gt;if&lt;/font&gt; (!&lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.DeleteFileTransacted(path, transactionHandle.DangerousGetHandle()))                &lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;                    &lt;/font&gt;WindowsAPI&lt;/font&gt;.ThrowsLastError();&lt;br&gt;        }&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; CopyTransacted(&lt;font color="#0000ff"&gt;string&lt;/font&gt; from, &lt;font color="#0000ff"&gt;string&lt;/font&gt; to, &lt;font color="#0000ff"&gt;bool&lt;/font&gt; overwrite)&lt;br&gt;        {&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;using&lt;/font&gt; (&lt;font color="#2b91af"&gt;KernelTransactionHandle&lt;/font&gt; transactionHandle = &lt;font color="#2b91af"&gt;KernelTransactionHandle&lt;/font&gt;.Get())&lt;br&gt;            {&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;                &lt;/font&gt;bool&lt;/font&gt; cancel = &lt;font color="#0000ff"&gt;false&lt;/font&gt;;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;                &lt;/font&gt;if&lt;/font&gt; (!&lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.CopyFileTransacted&lt;br&gt;                        (&lt;br&gt;                            from,&lt;br&gt;                            to,&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;                            &lt;/font&gt;IntPtr&lt;/font&gt;.Zero,&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;                            &lt;/font&gt;IntPtr&lt;/font&gt;.Zero,&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;                            &lt;/font&gt;ref&lt;/font&gt; cancel,&lt;br&gt;                            overwrite ? 0 : &lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.&lt;font color="#2b91af"&gt;Constants&lt;/font&gt;.&lt;font color="#2b91af"&gt;CopyFile&lt;/font&gt;.COPY_FILE_FAIL_IF_EXISTS,&lt;br&gt;                            transactionHandle.DangerousGetHandle()&lt;br&gt;                        )&lt;br&gt;                )&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;                    &lt;/font&gt;WindowsAPI&lt;/font&gt;.ThrowsLastError();&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#2b91af"&gt;FileStream&lt;/font&gt; OpenTransacted(&lt;font color="#0000ff"&gt;string&lt;/font&gt; path, &lt;font color="#2b91af"&gt;FileMode&lt;/font&gt; mode, &lt;font color="#2b91af"&gt;FileAccess&lt;/font&gt; access, &lt;font color="#2b91af"&gt;FileShare&lt;/font&gt; share)&lt;br&gt;        {&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;using&lt;/font&gt; (&lt;font color="#2b91af"&gt;KernelTransactionHandle&lt;/font&gt; transactionHandle = &lt;font color="#2b91af"&gt;KernelTransactionHandle&lt;/font&gt;.Get())&lt;br&gt;            {&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;                &lt;/font&gt;SafeFileHandle&lt;/font&gt; fileTransactedHandle = &lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.CreateFileTransacted&lt;br&gt;                                                                        (&lt;br&gt;                                                                            path,&lt;br&gt;                                                                            ToNativeFileAccess(access),&lt;br&gt;                                                                            ToNativeFileShare(share),&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;                                                                            &lt;/font&gt;IntPtr&lt;/font&gt;.Zero,&lt;br&gt;                                                                            ToNativeFileMode(mode),&lt;br&gt;                                                                            0,&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;                                                                            &lt;/font&gt;IntPtr&lt;/font&gt;.Zero,&lt;br&gt;                                                                            transactionHandle.DangerousGetHandle(),&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;                                                                            &lt;/font&gt;IntPtr&lt;/font&gt;.Zero,&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;                                                                            &lt;/font&gt;IntPtr&lt;/font&gt;.Zero&lt;br&gt;                                                                        );&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;                &lt;/font&gt;if&lt;/font&gt; (fileTransactedHandle.IsInvalid)  &lt;/font&gt;
&lt;div&gt;&lt;font size=1&gt;                    &lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.ThrowsLastError();&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;                &lt;/font&gt;return&lt;/font&gt; &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;FileStream&lt;/font&gt;(fileTransactedHandle, access);&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;static&lt;/font&gt; &lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.&lt;font color="#2b91af"&gt;Constants&lt;/font&gt;.&lt;font color="#2b91af"&gt;FileAccess&lt;/font&gt; ToNativeFileAccess(&lt;font color="#2b91af"&gt;FileAccess&lt;/font&gt; access)&lt;br&gt;        {&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;if&lt;/font&gt; (&lt;font color="#2b91af"&gt;FileAccess&lt;/font&gt;.Read == access)&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;                &lt;/font&gt;return&lt;/font&gt; &lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.&lt;font color="#2b91af"&gt;Constants&lt;/font&gt;.&lt;font color="#2b91af"&gt;FileAccess&lt;/font&gt;.GENERIC_READ;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;else&lt;/font&gt; &lt;font color="#0000ff"&gt;if&lt;/font&gt; (&lt;font color="#2b91af"&gt;FileAccess&lt;/font&gt;.Write == access)&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;                &lt;/font&gt;return&lt;/font&gt; &lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.&lt;font color="#2b91af"&gt;Constants&lt;/font&gt;.&lt;font color="#2b91af"&gt;FileAccess&lt;/font&gt;.GENERIC_WRITE;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;return&lt;/font&gt; &lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.&lt;font color="#2b91af"&gt;Constants&lt;/font&gt;.&lt;font color="#2b91af"&gt;FileAccess&lt;/font&gt;.GENERIC_READ | &lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.&lt;font color="#2b91af"&gt;Constants&lt;/font&gt;.&lt;font color="#2b91af"&gt;FileAccess&lt;/font&gt;.GENERIC_WRITE;&lt;br&gt;        }&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;static&lt;/font&gt; &lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.&lt;font color="#2b91af"&gt;Constants&lt;/font&gt;.&lt;font color="#2b91af"&gt;FileMode&lt;/font&gt; ToNativeFileMode(&lt;font color="#2b91af"&gt;FileMode&lt;/font&gt; mode)&lt;br&gt;        {&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;return&lt;/font&gt; (&lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.&lt;font color="#2b91af"&gt;Constants&lt;/font&gt;.&lt;font color="#2b91af"&gt;FileMode&lt;/font&gt;)(&lt;font color="#0000ff"&gt;int&lt;/font&gt;)(&lt;font color="#2b91af"&gt;FileMode&lt;/font&gt;.Append == mode ? &lt;font color="#2b91af"&gt;FileMode&lt;/font&gt;.OpenOrCreate : mode);&lt;br&gt;        }&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;static&lt;/font&gt; &lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.&lt;font color="#2b91af"&gt;Constants&lt;/font&gt;.&lt;font color="#2b91af"&gt;FileShare&lt;/font&gt; ToNativeFileShare(&lt;font color="#2b91af"&gt;FileShare&lt;/font&gt; share)&lt;br&gt;        {&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;return&lt;/font&gt; (&lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.&lt;font color="#2b91af"&gt;Constants&lt;/font&gt;.&lt;font color="#2b91af"&gt;FileShare&lt;/font&gt;)(&lt;font color="#0000ff"&gt;int&lt;/font&gt;)share;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;    &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;class&lt;/font&gt; &lt;font color="#2b91af"&gt;KernelTransactionHandle&lt;/font&gt; : &lt;/font&gt;&lt;font size=1&gt;&lt;font color="#2b91af"&gt;SafeHandleZeroOrMinusOneIsInvalid&lt;br&gt;&lt;/font&gt;    {&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;internal&lt;/font&gt; KernelTransactionHandle(&lt;font color="#2b91af"&gt;IntPtr&lt;/font&gt; existingHandle) : &lt;font color="#0000ff"&gt;this&lt;/font&gt;(existingHandle, &lt;font color="#0000ff"&gt;true&lt;/font&gt;) { }&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;internal&lt;/font&gt; KernelTransactionHandle(&lt;font color="#2b91af"&gt;IntPtr&lt;/font&gt; existingHandle, &lt;font color="#0000ff"&gt;bool&lt;/font&gt; ownsHandle) : &lt;font color="#0000ff"&gt;base&lt;/font&gt;(&lt;font color="#0000ff"&gt;true&lt;/font&gt;)&lt;br&gt;        {&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;this&lt;/font&gt;.SetHandle(existingHandle);&lt;br&gt;        }&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;protected&lt;/font&gt; &lt;font color="#0000ff"&gt;override&lt;/font&gt; &lt;font color="#0000ff"&gt;bool&lt;/font&gt; ReleaseHandle() { &lt;font color="#0000ff"&gt;return&lt;/font&gt; &lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.CloseHandle(handle); }&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#2b91af"&gt;KernelTransactionHandle&lt;/font&gt; Get() { &lt;font color="#0000ff"&gt;return&lt;/font&gt; Get(&lt;font color="#2b91af"&gt;Transaction&lt;/font&gt;.Current); }&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;        &lt;/font&gt;public&lt;/font&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#2b91af"&gt;KernelTransactionHandle&lt;/font&gt; Get(&lt;font color="#2b91af"&gt;Transaction&lt;/font&gt; transaction)&lt;br&gt;        {&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;if&lt;/font&gt; (&lt;font color="#0000ff"&gt;null&lt;/font&gt; == transaction)&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;                &lt;/font&gt;throw&lt;/font&gt; &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;NullReferenceException&lt;/font&gt;();&lt;br&gt;&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;IKernelTransaction&lt;/font&gt; kernelTransaction = &lt;font color="#2b91af"&gt;TransactionInterop&lt;/font&gt;.GetDtcTransaction(transaction) &lt;font color="#0000ff"&gt;as&lt;/font&gt; &lt;font color="#2b91af"&gt;IKernelTransaction&lt;/font&gt;;&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;KernelTransactionHandle&lt;/font&gt; transactionHandler = &lt;font color="#0000ff"&gt;null&lt;/font&gt;;&lt;br&gt;&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;RuntimeHelpers&lt;/font&gt;.PrepareConstrainedRegions();&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;try&lt;/font&gt; { } &lt;/font&gt;&lt;font color="#008000" size=1&gt;//CER Scope &lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;finally&lt;/font&gt;&lt;br&gt;            {&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#444444"&gt;                &lt;/font&gt;IntPtr&lt;/font&gt; txHandle;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;                &lt;/font&gt;int&lt;/font&gt; hr = kernelTransaction.GetHandle(&lt;font color="#0000ff"&gt;out&lt;/font&gt; txHandle);&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;                &lt;/font&gt;if&lt;/font&gt; (!&lt;font color="#2b91af"&gt;WindowsAPI&lt;/font&gt;.SUCCEDDED(hr)) &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;                    &lt;font color="#0000ff"&gt;throw&lt;/font&gt; &lt;font color="#0000ff"&gt;new&lt;/font&gt; System.ComponentModel.&lt;font color="#2b91af"&gt;Win32Exception&lt;/font&gt;(hr);&lt;br&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=1&gt;                transactionHandler = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;KernelTransactionHandle&lt;/font&gt;(txHandle);&lt;br&gt;            } &lt;/font&gt;&lt;font size=1&gt;&lt;font color="#008000"&gt;//CER Scope&lt;br&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;font color="#444444"&gt;            &lt;/font&gt;return&lt;/font&gt; transactionHandler;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;/font&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5300274535508806924&amp;page=RSS%3a+TechEd+Brasil+2007+-+TxF+Demo+%234&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=fabiogaluppo.spaces.live.com&amp;amp;GT1=fabiogaluppo"&gt;</description><category>Windows SDK</category><comments>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!152.entry#comment</comments><guid isPermaLink="true">http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!152.entry</guid><pubDate>Thu, 03 Jan 2008 12:57:33 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://fabiogaluppo.spaces.live.com/blog/cns!B671A4645AF2F2F4!152/comments/feed.rss</wfw:commentRss><wfw:comment>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!152.entry#comment</wfw:comment><dcterms:modified>2008-01-03T12:59:07Z</dcterms:modified></item><item><title>Web Page request asynchronously with Parallelspace</title><link>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!151.entry</link><description>&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Today, I released the &lt;a href="http://www.codeplex.com/parallelspace"&gt;Parallelspace&lt;/a&gt; &lt;a href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=parallelspace&amp;amp;ReleaseId=9472"&gt;version 0.2&lt;/a&gt;. The following sample is a classic implementation of many threads requesting web pages. &lt;/div&gt;
&lt;div&gt;This new version has a lot of new stuff like Async I/O operations via Begin/End methods. In this sample, AsyncUtil.WebRequestGetResponse is responsable to call the Async I/O operations.&lt;/div&gt;
&lt;div&gt;&lt;font color="#0000ff" size=2&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000" size=1&gt; System;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000" size=1&gt; System.Threading;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000" size=1&gt; System.Net;&lt;/font&gt;&lt;/div&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;
&lt;div&gt;&lt;br&gt;&lt;font size=1&gt;using &lt;/font&gt;&lt;/div&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt;Parallelspace;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;font color="#000000"&gt; Parallelspace.Utilities;&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#2b91af"&gt;WebRequestResponseAsyncSample&lt;br&gt;&lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;    private&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; UseProxy(&lt;font color="#2b91af"&gt;WebRequest&lt;/font&gt; req, &lt;font color="#0000ff"&gt;string&lt;/font&gt; proxyAddress, &lt;font color="#0000ff"&gt;string&lt;/font&gt; user, &lt;font color="#0000ff"&gt;string&lt;/font&gt; pwd)&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;{&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;WebProxy&lt;/font&gt; proxy = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;WebProxy&lt;/font&gt;(proxyAddress);&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;proxy.Credentials = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;NetworkCredential&lt;/font&gt;(user, pwd);&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;req.Proxy = proxy;&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;}&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;    private&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; Display( &lt;font color="#0000ff"&gt;string&lt;/font&gt; url, &lt;font color="#0000ff"&gt;string&lt;/font&gt; content )&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;{&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;String&lt;/font&gt; line = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;String&lt;/font&gt;(&lt;font color="#a31515"&gt;'-'&lt;/font&gt;, url.Length + 5);&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;System.Text.&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt; sb = &lt;font color="#0000ff"&gt;new&lt;/font&gt; System.Text.&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;();&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;sb.AppendFormat(&lt;font color="#a31515"&gt;&amp;quot;{0}\r\n&amp;quot;&lt;/font&gt;, line);&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;sb.AppendFormat(&lt;font color="#a31515"&gt;&amp;quot;url: {0}\r\n&amp;quot;&lt;/font&gt;, url);&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;sb.AppendFormat(&lt;font color="#a31515"&gt;&amp;quot;thread id: {0}\r\n&amp;quot;&lt;/font&gt;, &lt;font color="#2b91af"&gt;Thread&lt;/font&gt;.CurrentThread.ManagedThreadId);&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;sb.AppendFormat(&lt;font color="#a31515"&gt;&amp;quot;{0}\r\n&amp;quot;&lt;/font&gt;, line);&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;sb.Append(content); &lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;sb.AppendFormat(&lt;font color="#a31515"&gt;&amp;quot;\r\n{0}\r\n&amp;quot;&lt;/font&gt;, line);&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;Console&lt;/font&gt;.WriteLine(sb.ToString());&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;}&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;    public&lt;/font&gt; &lt;font color="#2b91af"&gt;Future&lt;/font&gt; UrlGetAsync(&lt;font color="#2b91af"&gt;Block&lt;/font&gt; block, &lt;font color="#0000ff"&gt;string&lt;/font&gt; url)&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;        return&lt;/font&gt; block.Run&amp;lt;&lt;font color="#2b91af"&gt;DataWithWaitHandle&lt;/font&gt;&amp;lt;&lt;font color="#2b91af"&gt;WebResponse&lt;/font&gt;, &lt;font color="#2b91af"&gt;ManualResetEvent&lt;/font&gt;&amp;gt;&amp;gt;(&lt;br&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;            delegate&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;{&lt;br&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;                try&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;{&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;                    &lt;/font&gt;WebRequest&lt;/font&gt; req = &lt;font color="#2b91af"&gt;WebRequest&lt;/font&gt;.Create(url);&lt;br&gt;&lt;font color="#008000"&gt;&lt;font color="#0000ff"&gt;                    &lt;/font&gt;//UseProxy(req, &amp;quot;proxy_address&amp;quot;, &amp;quot;user&amp;quot;, &amp;quot;password&amp;quot; );&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;                    return&lt;/font&gt; &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;DataWithWaitHandle&lt;/font&gt;&amp;lt;&lt;font color="#2b91af"&gt;WebResponse&lt;/font&gt;, &lt;font color="#2b91af"&gt;ManualResetEvent&lt;/font&gt;&amp;gt;&lt;br&gt;&lt;font color="#0000ff"&gt;                        &lt;/font&gt;(&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;                            &lt;/font&gt;AsyncUtil&lt;/font&gt;.WebRequestGetResponse(req),&lt;br&gt;&lt;font color="#0000ff"&gt;                            new&lt;/font&gt; &lt;font color="#2b91af"&gt;ManualResetEvent&lt;/font&gt;(&lt;font color="#0000ff"&gt;false&lt;/font&gt;)&lt;br&gt;&lt;font color="#0000ff"&gt;                        &lt;/font&gt;);&lt;br&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;}&lt;br&gt;&lt;font color="#0000ff"&gt;                catch&lt;/font&gt; (&lt;font color="#2b91af"&gt;Exception&lt;/font&gt; e)&lt;br&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;                    &lt;/font&gt;Display(url, e.Message);&lt;br&gt;&lt;font color="#0000ff"&gt;                    return&lt;/font&gt; &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;DataWithWaitHandle&lt;/font&gt;&amp;lt;&lt;font color="#2b91af"&gt;WebResponse&lt;/font&gt;, &lt;font color="#2b91af"&gt;ManualResetEvent&lt;/font&gt;&amp;gt;(&lt;font color="#0000ff"&gt;null&lt;/font&gt;, &lt;br&gt;&lt;font color="#0000ff"&gt;                                    new&lt;/font&gt; &lt;font color="#2b91af"&gt;ManualResetEvent&lt;/font&gt;(&lt;font color="#0000ff"&gt;true&lt;/font&gt;));&lt;br&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;}&lt;br&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;},&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;            delegate&lt;/font&gt;(&lt;font color="#2b91af"&gt;Future&lt;/font&gt;&amp;lt;&lt;font color="#2b91af"&gt;DataWithWaitHandle&lt;/font&gt;&amp;lt;&lt;font color="#2b91af"&gt;WebResponse&lt;/font&gt;, &lt;font color="#2b91af"&gt;ManualResetEvent&lt;/font&gt;&amp;gt;&amp;gt; f)&lt;br&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;{&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;DataWithWaitHandle&lt;/font&gt;&amp;lt;&lt;font color="#2b91af"&gt;WebResponse&lt;/font&gt;, &lt;font color="#2b91af"&gt;ManualResetEvent&lt;/font&gt;&amp;gt; value = f.Value;&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;                if&lt;/font&gt; (&lt;font color="#0000ff"&gt;null&lt;/font&gt; != value.Data)&lt;br&gt;&lt;font color="#0000ff"&gt;                    using&lt;/font&gt; (System.IO.&lt;font color="#2b91af"&gt;StreamReader&lt;/font&gt; sr = &lt;font color="#0000ff"&gt;new&lt;/font&gt; System.IO.&lt;font color="#2b91af"&gt;StreamReader&lt;/font&gt;(value.Data.GetResponseStream()))&lt;br&gt;&lt;font color="#0000ff"&gt;                        &lt;/font&gt;Display(url, sr.ReadToEnd().Substring(0, 1024)); &lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;value.WaitHandle.Set();&lt;br&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;},&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;url&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;);&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;}&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;    public&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; Run( &lt;font color="#0000ff"&gt;params&lt;/font&gt; &lt;font color="#0000ff"&gt;string&lt;/font&gt;[] urls )&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;        if&lt;/font&gt; (&lt;font color="#0000ff"&gt;null&lt;/font&gt; != urls &amp;amp;&amp;amp; urls.Length &amp;gt; 0)&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;{&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;Future&lt;/font&gt;[] f = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Future&lt;/font&gt;[urls.Length];&lt;br&gt;&lt;font color="#0000ff"&gt;            for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = 0; i &amp;lt; urls.Length; ++i)&lt;br&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;f[i] = UrlGetAsync(&lt;font color="#2b91af"&gt;BlockRunner&lt;/font&gt;.Get(), urls[i]);&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;WaitHandle&lt;/font&gt;.WaitAll(&lt;font color="#2b91af"&gt;ConvertUtil&lt;/font&gt;.ToWaitHandleArray&amp;lt;&lt;font color="#2b91af"&gt;WebResponse&lt;/font&gt;, &lt;font color="#2b91af"&gt;ManualResetEvent&lt;/font&gt;&amp;gt;(f)); &lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;}&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;}&lt;br&gt;}&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000" size=1&gt; &lt;/font&gt;&lt;font size=1&gt;&lt;font color="#2b91af"&gt;Program&lt;br&gt;&lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;    static&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; Main(&lt;font color="#0000ff"&gt;string&lt;/font&gt;[] args)&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;{&lt;br&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#008000"&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;//new WebRequestResponseAsyncSample().Run(args);&lt;br&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;        new&lt;/font&gt; &lt;font color="#2b91af"&gt;WebRequestResponseAsyncSample&lt;/font&gt;().Run(&lt;br&gt;&lt;font color="#a31515"&gt;&lt;font color="#0000ff"&gt;                    &lt;/font&gt;&amp;quot;http://www.thisisnotsupposedtoexist.org/&amp;quot;&lt;/font&gt;,&lt;br&gt;&lt;font color="#a31515"&gt;&lt;font color="#0000ff"&gt;                    &lt;/font&gt;&amp;quot;http://www.live.com/&amp;quot;&lt;/font&gt;,&lt;br&gt;&lt;font color="#a31515"&gt;&lt;font color="#0000ff"&gt;                    &lt;/font&gt;&amp;quot;http://blogs.msdn.com/MSRoboticsStudio/&amp;quot;&lt;/font&gt;,&lt;br&gt;&lt;font color="#a31515"&gt;&lt;font color="#0000ff"&gt;                    &lt;/font&gt;&amp;quot;http://fabiogaluppo.spaces.live.com/&amp;quot;&lt;/font&gt;,&lt;br&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#a31515"&gt;&lt;font color="#0000ff"&gt;                    &lt;/font&gt;&amp;quot;This isn't an URL&amp;quot;&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;);&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;}&lt;br&gt;}&lt;/font&gt; 
&lt;div&gt;&lt;font size=2&gt;&lt;br&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;A &lt;a href="http://blogs.msdn.com/dsyme/archive/2007/10/11/introducing-f-asynchronous-workflows.aspx"&gt;cool implementation&lt;/a&gt; in F# can be found in &lt;a href="http://blogs.msdn.com/dsyme"&gt;Don Syme's blog&lt;/a&gt; (the main designer of F#). Another implementation, using &lt;a href="http://msdn2.microsoft.com/en-us/library/bb905447.aspx"&gt;CCR&lt;/a&gt;, was &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/09/ConcurrentAffairs/"&gt;presented at MSDN Magazine&lt;/a&gt; by &lt;a href="http://www.wintellect.com/cs/blogs/jeffreyr/default.aspx"&gt;Jeffrey Richter&lt;/a&gt;.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5300274535508806924&amp;page=RSS%3a+Web+Page+request+asynchronously+with+Parallelspace&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=fabiogaluppo.spaces.live.com&amp;amp;GT1=fabiogaluppo"&gt;</description><category>Concurrency</category><comments>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!151.entry#comment</comments><guid isPermaLink="true">http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!151.entry</guid><pubDate>Fri, 28 Dec 2007 20:09:25 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://fabiogaluppo.spaces.live.com/blog/cns!B671A4645AF2F2F4!151/comments/feed.rss</wfw:commentRss><wfw:comment>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!151.entry#comment</wfw:comment><dcterms:modified>2007-12-28T20:20:11Z</dcterms:modified></item><item><title>MapReduce with Parallelspace</title><link>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!150.entry</link><description>&lt;p&gt;  
&lt;p&gt;I was reading about MapReduce &lt;a href="http://www.cs.vu.nl/~ralf/MapReduce/paper.pdf"&gt;here&lt;/a&gt; and &lt;a href="http://labs.trolltech.com/blogs/2007/04/26/mapreduce-in-qt-concurrent/"&gt;there&lt;/a&gt;, and I remember that I had posted something about &lt;a href="http://fabiogaluppo.blogspot.com/2006_10_01_archive.html"&gt;MapReduce&lt;/a&gt; at &lt;a href="http://fabiogaluppo.blogspot.com/"&gt;my old house&lt;/a&gt;.  
&lt;p&gt;Techniques applied in MapReduce gives me a great opportunity to show concurrency with &lt;a href="http://www.codeplex.com/parallelspace"&gt;Parallelspace&lt;/a&gt; (of course, it can be done with any &lt;a href="http://msdn2.microsoft.com/en-us/concurrency/default.aspx"&gt;other library&lt;/a&gt;). 
&lt;p&gt;In my point of view, MapReduce is a pure application of &lt;a href="http://safari.oreilly.com/0321228111/ch05lev1sec7"&gt;Fork/Join parallel pattern&lt;/a&gt;. So, you must: 1. create a data partition - breaking this data in pieces; 2. spawn tasks (fork) and define how to use these chunks producing a partial result (map); 3. wait for tasks to complete (join); and 4. consolidate the results in the end (reduce). The following C# 2.0 code, demonstrate a word count program applying MapReduce with &lt;a href="http://www.codeplex.com/parallelspace"&gt;Parallelspace&lt;/a&gt;. &lt;br&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; System;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;font color="#000000"&gt; System.IO;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;font color="#000000"&gt; System.Collections.Generic;&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;using&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; Parallelspace;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;font color="#000000"&gt; Parallelspace.Schedulers;&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;sealed&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#2b91af"&gt;WordCount&lt;br&gt;&lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;    public&lt;/font&gt; &lt;font color="#0000ff"&gt;delegate&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; &lt;font color="#2b91af"&gt;Action2&lt;/font&gt;&amp;lt;T0, T1&amp;gt;(T0 p0, T1 p1);&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;    public&lt;/font&gt; &lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt; MappedReduced(&lt;font color="#0000ff"&gt;string&lt;/font&gt;[] files, &lt;font color="#2b91af"&gt;ReturnAction&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt;&amp;gt; countWords, &lt;font color="#2b91af"&gt;Action2&lt;/font&gt;&amp;lt;&lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt;, &lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt;&amp;gt; consolidation)&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;{&lt;br&gt;&lt;font color="#008000"&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;       int&lt;/font&gt; numberOfPartitions = &lt;font color="#2b91af"&gt;Environment&lt;/font&gt;.ProcessorCount * 2; &lt;font color="#008000"&gt;//2 threads per core&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#0000ff" size=2&gt;
&lt;p&gt;&lt;font size=1&gt;        if&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; (files.Length &amp;lt; numberOfPartitions) numberOfPartitions = files.Length;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;        int&lt;/font&gt; delta = files.Length / numberOfPartitions;&lt;br&gt;&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;Block&lt;/font&gt; asyncBlock = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Block&lt;/font&gt;(&lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;ThreadScheduler&lt;/font&gt;(&lt;font color="#0000ff"&gt;true&lt;/font&gt;));&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;Future&lt;/font&gt;[] futures = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Future&lt;/font&gt;[numberOfPartitions];&lt;br&gt;&lt;br&gt;&lt;font color="#008000"&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;//&amp;quot;Parallel.For&amp;quot;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;        for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; step = 0; step &amp;lt; numberOfPartitions; ++step)&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;            int&lt;/font&gt; begin = delta * step,&lt;br&gt;&lt;font color="#0000ff"&gt;                 &lt;/font&gt;end  = numberOfPartitions - 1 == step ? files.Length : begin + delta;&lt;br&gt;&lt;br&gt;&lt;font color="#008000"&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;//Fork&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;futures[step] = asyncBlock.Run&amp;lt;&lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt;&amp;gt;(&lt;br&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#0000ff"&gt;                delegate&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;{&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;                    &lt;/font&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt; temp = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt;();&lt;br&gt;&lt;font color="#0000ff"&gt;                    for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = begin; i &amp;lt; end; ++i) consolidation(temp, countWords(files[i]));&lt;br&gt;&lt;font color="#0000ff"&gt;                    return&lt;/font&gt; temp;&lt;br&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;});&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;}&lt;br&gt;&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;&lt;/font&gt;&lt;font color="#008000"&gt;//Join&lt;/font&gt;&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt; wordCount = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;,&lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt;();&lt;font color="#008000"&gt;&lt;font color="#0000ff"&gt;  &lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;        foreach&lt;/font&gt; (&lt;font color="#2b91af"&gt;Future&lt;/font&gt;&amp;lt;&lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt;&amp;gt; f &lt;font color="#0000ff"&gt;in&lt;/font&gt; futures)&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;{&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt; v = f.Value;&lt;br&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;consolidation(wordCount, f.Value);&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;}&lt;br&gt;&lt;font color="#0000ff"&gt;        return&lt;/font&gt; wordCount;&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;}&lt;br&gt;}&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#2b91af"&gt;Program&lt;/font&gt;&lt;br&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;    static&lt;/font&gt; &lt;font color="#0000ff"&gt;string&lt;/font&gt;[] Split(&lt;font color="#0000ff"&gt;string&lt;/font&gt; line)&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;        return&lt;/font&gt; line.Split(&lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#0000ff"&gt;char&lt;/font&gt;[]{&lt;font color="#a31515"&gt;' '&lt;/font&gt;}, &lt;font color="#2b91af"&gt;StringSplitOptions&lt;/font&gt;.RemoveEmptyEntries);&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;}&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;    static&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; KeyCount(&lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt; dictionary, &lt;font color="#0000ff"&gt;string&lt;/font&gt; key, &lt;font color="#0000ff"&gt;long&lt;/font&gt; value)&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;dictionary[key] = dictionary.ContainsKey(key) ? dictionary[key] + value : value;&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;}&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;    static&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; Dump(&lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt; result)&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;        foreach&lt;/font&gt; (&lt;font color="#2b91af"&gt;KeyValuePair&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt; entry &lt;font color="#0000ff"&gt;in&lt;/font&gt; result)&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;Console&lt;/font&gt;.Write(&lt;font color="#a31515"&gt;&amp;quot;[{0} = {1}] &amp;quot;&lt;/font&gt;, entry.Key, entry.Value); &lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;}&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;    static&lt;/font&gt; &lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt; WordCountMappedReduced(&lt;font color="#0000ff"&gt;string&lt;/font&gt; directory, &lt;font color="#0000ff"&gt;string&lt;/font&gt; searchPattern)&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;        return&lt;/font&gt; &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;WordCount&lt;/font&gt;().MappedReduced&lt;br&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;(&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;Directory&lt;/font&gt;.GetFiles(directory, searchPattern),&lt;br&gt;&lt;br&gt;&lt;font color="#008000"&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;/* map method */&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;                delegate&lt;/font&gt;(&lt;font color="#0000ff"&gt;string&lt;/font&gt; file)&lt;br&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;{&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;                    &lt;/font&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt; wordCount = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt;();&lt;br&gt;&lt;font color="#0000ff"&gt;                    using&lt;/font&gt; (&lt;font color="#2b91af"&gt;StreamReader&lt;/font&gt; sr = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;StreamReader&lt;/font&gt;(&lt;font color="#2b91af"&gt;File&lt;/font&gt;.OpenRead(file)))&lt;br&gt;&lt;font color="#0000ff"&gt;                    &lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;                        while&lt;/font&gt; (sr.Peek() &amp;gt;= 0)&lt;br&gt;&lt;font color="#0000ff"&gt;                            foreach&lt;/font&gt; (&lt;font color="#0000ff"&gt;string&lt;/font&gt; word &lt;font color="#0000ff"&gt;in&lt;/font&gt; Split(sr.ReadLine()))&lt;br&gt;&lt;font color="#0000ff"&gt;                                &lt;/font&gt;KeyCount(wordCount, word, 1);&lt;br&gt;&lt;font color="#0000ff"&gt;                            return&lt;/font&gt; wordCount;&lt;br&gt;&lt;font color="#0000ff"&gt;                    &lt;/font&gt;}&lt;br&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;},&lt;br&gt;&lt;br&gt;&lt;font color="#008000"&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;/* reduce method */&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;                delegate&lt;/font&gt;(&lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt; destination, &lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt; source)&lt;br&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;{&lt;br&gt;&lt;font color="#0000ff"&gt;                    foreach&lt;/font&gt; (&lt;font color="#2b91af"&gt;KeyValuePair&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt; entry &lt;font color="#0000ff"&gt;in&lt;/font&gt; source)&lt;br&gt;&lt;font color="#0000ff"&gt;                        &lt;/font&gt;KeyCount(destination, entry.Key, entry.Value);&lt;br&gt;&lt;font color="#0000ff"&gt;                &lt;/font&gt;}&lt;br&gt;&lt;font color="#0000ff"&gt;            &lt;/font&gt;);&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;}&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;    static&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; Main(&lt;font color="#0000ff"&gt;string&lt;/font&gt;[] args)&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;{&lt;br&gt;&lt;font color="#008000"&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;//args: 0 = directory; 1 = search pattern;&lt;/font&gt;&lt;br&gt;&lt;font color="#2b91af"&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;Dictionary&lt;/font&gt;&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#0000ff"&gt;long&lt;/font&gt;&amp;gt; result = WordCountMappedReduced(args[0], args[1]);&lt;br&gt;&lt;font color="#0000ff"&gt;        &lt;/font&gt;Dump(result);&lt;br&gt;&lt;font color="#0000ff"&gt;    &lt;/font&gt;}&lt;br&gt;}&lt;/font&gt;&lt;br&gt;&lt;/font&gt;
&lt;p&gt;Did you perceived this is a lock-free implementation? 
&lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/MapReduce"&gt;Google´s MapReduce&lt;/a&gt; was VERY influenced by map and reduce features from &lt;a href="http://en.wikipedia.org/wiki/LISP"&gt;LISP&lt;/a&gt;. Obviously, the Google framework is more than a programming style. But, the MapReduce (or Fork/Join) can be implemented with any &lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;functional programming languages&lt;/a&gt; (or even non-functional programming languages). Virtually, through Delegate, any .NET language support a functional-style of programming. For each new release, C# is incorporating more and more functional programming elements (lambda expressions, type inference, closures, ...). And C++, &lt;a href="http://www.informit.com/podcasts/episode.aspx?e=356872f9-fc8f-4165-bf5b-9b17be64a7fa"&gt;in the future (0x)&lt;/a&gt;, will be supporting &lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2487.pdf"&gt;lambda as first-class language&lt;/a&gt; feature! (I hope) &lt;img title=Festa style="vertical-align:middle" alt=Festa src="http://shared.live.com/HjKMzTS-xzcms40!CabizA/emoticons/smile_party.gif"&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5300274535508806924&amp;page=RSS%3a+MapReduce+with+Parallelspace&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=fabiogaluppo.spaces.live.com&amp;amp;GT1=fabiogaluppo"&gt;</description><category>Concurrency</category><comments>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!150.entry#comment</comments><guid isPermaLink="true">http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!150.entry</guid><pubDate>Mon, 24 Dec 2007 20:18:44 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://fabiogaluppo.spaces.live.com/blog/cns!B671A4645AF2F2F4!150/comments/feed.rss</wfw:commentRss><wfw:comment>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!150.entry#comment</wfw:comment><dcterms:modified>2008-01-23T11:57:03Z</dcterms:modified></item><item><title>TechEd Brasil 2007 - TxF Demo #3</title><link>http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!149.entry</link><description>&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The &amp;quot;DTC way&amp;quot; to  TxF. This &lt;em&gt;procedural C++ sample&lt;/em&gt; is fine, but in real world application &lt;a href="http://msdn2.microsoft.com/en-us/library/aa365008.aspx"&gt;close the file handle before commit (or rollback) the transaction&lt;/a&gt;:&lt;/div&gt;
&lt;div&gt;&lt;font color="#0000ff" size=2&gt;&lt;br&gt;&lt;font size=1&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000" size=1&gt; &lt;/font&gt;&lt;font size=1&gt;&lt;font color="#a31515"&gt;&amp;lt;windows.h&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;#include&lt;/font&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#a31515"&gt;&amp;lt;xolehlp.h&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;#include&lt;/font&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#a31515"&gt;&amp;lt;txdtc.h&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;#include&lt;/font&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#a31515"&gt;&amp;lt;transact.h&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;#include&lt;/font&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size=1&gt;&amp;lt;winbase.h&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;&lt;font size=1&gt;#define&lt;/font&gt;&lt;/font&gt;&lt;font size=1&gt;&lt;font color="#000000"&gt; STRSAFE_LIB&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;#include&lt;/font&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size=1&gt;&amp;lt;strsafe.h&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&