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