<?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="fiber-tasks_8md" kind="file" language="Markdown">
    <compoundname>fiber-tasks.md</compoundname>
    <briefdescription>
    </briefdescription>
    <detaileddescription>
    </detaileddescription>
    <programlisting>
<codeline><highlight class="normal">Fiber<sp/>Tasks</highlight></codeline>
<codeline><highlight class="normal">===========</highlight></codeline>
<codeline><highlight class="normal">A<sp/>&quot;Fiber<sp/>Task&quot;<sp/>is<sp/>any<sp/>non-blocking<sp/>task<sp/>executed<sp/>on<sp/>a<sp/>[FiberTaskScheduler](@ref<sp/>SpicyPixel.Threading.Tasks.FiberTaskScheduler),<sp/>but<sp/>the<sp/>most<sp/>versatile<sp/>fiber<sp/>task<sp/>is<sp/>a<sp/>[YieldableTask](@ref<sp/>SpicyPixel.Threading.Tasks.YieldableTask).<sp/>These<sp/>tasks<sp/>are<sp/>designed<sp/>to<sp/>yield<sp/>execution<sp/>so<sp/>that<sp/>multiple<sp/>tasks<sp/>can<sp/>execute<sp/>concurrently<sp/>on<sp/>the<sp/>same<sp/>thread.</highlight></codeline>
<codeline><highlight class="normal"><sp/></highlight></codeline>
<codeline><highlight class="normal">For<sp/>a<sp/>full<sp/>explanation<sp/>of<sp/>how<sp/>tasks<sp/>and<sp/>schedulers<sp/>work,<sp/>see<sp/>the<sp/>[Task<sp/>Parallel<sp/>Library](http://msdn.microsoft.com/en-us/library/dd460717.aspx)<sp/>documentation<sp/>on<sp/>MSDN.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Creating<sp/>a<sp/>fiber<sp/>task<sp/>scheduler</highlight></codeline>
<codeline><highlight class="normal">-------------------------------</highlight></codeline>
<codeline><highlight class="normal">Creating<sp/>a<sp/>fiber<sp/>task<sp/>scheduler<sp/>is<sp/>a<sp/>two<sp/>part<sp/>process:<sp/>create<sp/>a<sp/>fiber<sp/>scheduler<sp/>you<sp/>want<sp/>to<sp/>use<sp/>and<sp/>then<sp/>wrap<sp/>that<sp/>scheduler<sp/>in<sp/>a<sp/>FiberTaskScheduler.</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">var<sp/>taskScheduler<sp/>=<sp/>new<sp/>FiberTaskScheduler(SystemFiberScheduler.StartNew());</highlight></codeline>
<codeline><highlight class="normal">```</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Executing<sp/>yieldable<sp/>tasks</highlight></codeline>
<codeline><highlight class="normal">-------------------------</highlight></codeline>
<codeline><highlight class="normal">Once<sp/>a<sp/>scheduler<sp/>has<sp/>been<sp/>created,<sp/>yieldable<sp/>tasks<sp/>can<sp/>be<sp/>queued<sp/>to<sp/>it.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">void<sp/>Main()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<sp/>Start<sp/>a<sp/>task<sp/>scheduler<sp/>to<sp/>dispatch<sp/>tasks<sp/>as<sp/>fibers</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<sp/>on<sp/>a<sp/>separate<sp/>thread</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>var<sp/>taskScheduler<sp/>=<sp/>new<sp/>FiberTaskScheduler(SystemFiberScheduler.StartNew());</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<sp/>Start<sp/>a<sp/>new<sp/>task,<sp/>continue<sp/>it<sp/>with<sp/>more<sp/>work,</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<sp/>then<sp/>wait<sp/>for<sp/>it<sp/>to<sp/>complete</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>var<sp/>task<sp/>=<sp/>Task.Factory.StartNew(FadeOutCoroutine(),<sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>CancellationToken.None,<sp/>TaskCreationOptions.None,<sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>taskScheduler);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>task.ContinueWith(DoMoreWork(),<sp/>taskScheduler).Wait();</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">IEnumerator<sp/>FadeOutCoroutine()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>var<sp/>totalTime<sp/>=<sp/>4f;</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>var<sp/>currentTime<sp/>=<sp/>totalTime;</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>while(currentTime<sp/>&gt;<sp/>0f)</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>setAlpha(currentTime<sp/>/<sp/>totalTime);<sp/>//<sp/>fade<sp/>out</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>currentTime<sp/>-=<sp/>Time.deltaTime;</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>yield<sp/>return<sp/>FiberInstruction.YieldToAnyFiber;</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">IEnumerator<sp/>DoMoreWork()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>//<sp/>do<sp/>work</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline><highlight class="normal">```</highlight></codeline>
    </programlisting>
    <location file="Docs/fiber-tasks.md"/>
  </compounddef>
</doxygen>
