<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.15">
  <compounddef id="indexpage" kind="page">
    <compoundname>index</compoundname>
    <title>Spicy Pixel Concurrency Kit</title>
    <briefdescription>
    </briefdescription>
    <detaileddescription>
<para><ulink url="http://u3d.as/content/spicy-pixel/spicy-pixel-concurrency-kit">Download it now in the Unity Asset Store</ulink> | <ulink url="https://github.com/spicypixel/concurrency-kit-cs">Get the Source Code on GitHub</ulink></para>
<para>The Concurrency Kit is a .NET / Mono kit that includes a port of the <ulink url="http://msdn.microsoft.com/en-us/library/dd460717.aspx">Task Parallel Library</ulink> and extends it to support <ulink url="http://en.wikipedia.org/wiki/Fiber_(computer_science)">Fibers</ulink>, <ulink url="http://en.wikipedia.org/wiki/Coroutine">Coroutines</ulink>, and <ulink url="http://unity3d.com/">Unity</ulink>. Fibers allow code paths to execute concurrently using a single thread by leveraging the co-operative yielding behavior of coroutines.</para>
<para><programlisting filename=".cs"><codeline><highlight class="comment">//<sp/>Start<sp/>task<sp/>1</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal">var<sp/>t1<sp/>=<sp/>Task.Factory.StartNew(()<sp/>=&gt;<sp/>PatHead());</highlight></codeline>
<codeline><highlight class="normal"><sp/></highlight></codeline>
<codeline><highlight class="normal"></highlight><highlight class="comment">//<sp/>Start<sp/>task<sp/>2</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal">var<sp/>t2<sp/>=<sp/>Task.Factory.StartNew(()<sp/>=&gt;<sp/>RubTummy());</highlight></codeline>
<codeline><highlight class="normal"><sp/></highlight></codeline>
<codeline><highlight class="normal"></highlight><highlight class="comment">//<sp/>This<sp/>task<sp/>will<sp/>complete<sp/>when<sp/>t1<sp/>and<sp/>t2<sp/>complete<sp/>and</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"></highlight><highlight class="comment">//<sp/>then<sp/>it<sp/>will<sp/>continue<sp/>by<sp/>executing<sp/>a<sp/>happy<sp/>dance.</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal">Task.WhenAll(t1,<sp/>t2).ContinueWith(t3<sp/>=&gt;<sp/>HappyDance());</highlight></codeline>
</programlisting></para>
<para>Because code written in this manner is designed with concurrency in mind, tasks can run in parallel across multiple threads or as concurrent fibers on a single thread by changing out the task scheduler. This flexibility makes it easy to write and maintain portable asynchronous code that scales.</para>
<para><heading level="2">Interoperability </heading>
</para>
<para>Use the feature rich <bold>asynchronous task model</bold> in your designs.</para>
<para><programlisting filename=".cs"><codeline><highlight class="keyword">public</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">class<sp/></highlight><highlight class="normal">HttpClient<sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="keyword">public</highlight><highlight class="normal"><sp/>Task&lt;HttpResponseMessage&gt;<sp/>GetAsync(</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">string</highlight><highlight class="normal"><sp/>requestUri);</highlight></codeline>
<codeline><highlight class="normal"><sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="keyword">public</highlight><highlight class="normal"><sp/>Task&lt;HttpResponseMessage&gt;<sp/>PostAsync(</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">string</highlight><highlight class="normal"><sp/>requestUri,</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>HttpContent<sp/>content);</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
</programlisting></para>
<para><heading level="2">Usability </heading>
</para>
<para><itemizedlist>
<listitem><para>Start a background task using the thread pool and <bold>complete the operation on the main thread</bold></para>
</listitem><listitem><para>Declaratively schedule workflows with <bold>chained asynchronous tasks</bold> and <bold>anonymous delegates</bold></para>
</listitem></itemizedlist>
</para>
<para><programlisting filename=".cs"><codeline><highlight class="normal">Task.Factory.StartNew(()<sp/>=&gt;<sp/>DoSomethingFromThreadPool()).</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>ContinueWith(lastTask<sp/>=&gt;<sp/>DoSomethingFromMainThread(),<sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>mainThreadScheduler);</highlight></codeline>
</programlisting></para>
<para><itemizedlist>
<listitem><para><bold>Coordinate</bold> between concurrently executing tasks</para>
</listitem></itemizedlist>
</para>
<para><programlisting filename=".cs"><codeline><highlight class="normal">Task.Factory.ContinueWhenAny(tasksToRun,<sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>winner<sp/>=&gt;<sp/>print(</highlight><highlight class="stringliteral">&quot;The<sp/>winner<sp/>is:<sp/>&quot;</highlight><highlight class="normal"><sp/>+<sp/>winner));</highlight></codeline>
</programlisting></para>
<para><itemizedlist>
<listitem><para>Easily <bold>cancel tasks</bold> in progress</para>
</listitem></itemizedlist>
</para>
<para><programlisting filename=".cs"><codeline><highlight class="normal">CancellationTokenSource<sp/>tokenSource<sp/>=<sp/></highlight><highlight class="keyword">new</highlight><highlight class="normal"><sp/>CancellationTokenSource();</highlight></codeline>
<codeline><highlight class="normal"></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>Start()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>Task.Factory.StartNew(()<sp/>=&gt;<sp/>DoSomething(),<sp/>tokenSource.Token);</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline><highlight class="normal"></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>OnClick()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>tokenSource.Cancel();</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
</programlisting></para>
<para><heading level="2">Performance </heading>
</para>
<para><itemizedlist>
<listitem><para>Leverage <bold>multiple CPU cores</bold> for maximum throughput</para>
</listitem><listitem><para>Maximize individual thread usage with <bold>co-operative multitasking</bold> and task inlining</para>
</listitem><listitem><para><bold>Control how tasks are scheduled</bold> and the level of concurrency</para>
</listitem></itemizedlist>
</para>
<para><heading level="2">Productivity </heading>
</para>
<para><itemizedlist>
<listitem><para>Write more <bold>maintainable</bold>, more <bold>performant</bold> asynchronous code</para>
</listitem></itemizedlist>
</para>
<para><heading level="2">Learn More </heading>
</para>
<para>Learn more by reading the <ref refid="md__docs_overview" kindref="compound">Conceptual Documentation</ref> or <ulink url="http://spicypixel.com/developer/concurrency-kit/api-reference/">API Reference</ulink>.</para>
<para>See <ref refid="md__docs_build" kindref="compound">Building the Kit</ref> for information on compiling.</para>
<para><hruler/>
 Copyright (c) 2012-2014 <ulink url="http://spicypixel.com">Spicy Pixel, Inc.</ulink> </para>
    </detaileddescription>
  </compounddef>
</doxygen>
