<?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="md__docs_fiber-tasks" kind="page">
    <compoundname>md_Docs_fiber-tasks</compoundname>
    <title>Fiber Tasks</title>
    <briefdescription>
    </briefdescription>
    <detaileddescription>
<para>A &quot;Fiber Task&quot; is any non-blocking task executed on a <ref refid="class_spicy_pixel_1_1_threading_1_1_tasks_1_1_fiber_task_scheduler" kindref="compound">FiberTaskScheduler</ref>, but the most versatile fiber task is a <ref refid="class_spicy_pixel_1_1_threading_1_1_tasks_1_1_yieldable_task" kindref="compound">YieldableTask</ref>. These tasks are designed to yield execution so that multiple tasks can execute concurrently on the same thread.</para>
<para>For a full explanation of how tasks and schedulers work, see the <ulink url="http://msdn.microsoft.com/en-us/library/dd460717.aspx">Task Parallel Library</ulink> documentation on MSDN.</para>
<para><heading level="2">Creating a fiber task scheduler </heading>
</para>
<para>Creating a fiber task scheduler is a two part process: create a fiber scheduler you want to use and then wrap that scheduler in a FiberTaskScheduler.</para>
<para><programlisting filename=".cs"><codeline><highlight class="normal">var<sp/>taskScheduler<sp/>=<sp/></highlight><highlight class="keyword">new</highlight><highlight class="normal"><sp/>FiberTaskScheduler(SystemFiberScheduler.StartNew());</highlight></codeline>
</programlisting></para>
<para><heading level="2">Executing yieldable tasks </heading>
</para>
<para>Once a scheduler has been created, yieldable tasks can be queued to it.</para>
<para><programlisting filename=".cs"><codeline><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>Main()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Start<sp/>a<sp/>task<sp/>scheduler<sp/>to<sp/>dispatch<sp/>tasks<sp/>as<sp/>fibers</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>on<sp/>a<sp/>separate<sp/>thread</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>var<sp/>taskScheduler<sp/>=<sp/></highlight><highlight class="keyword">new</highlight><highlight class="normal"><sp/>FiberTaskScheduler(SystemFiberScheduler.StartNew());</highlight></codeline>
<codeline><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Start<sp/>a<sp/>new<sp/>task,<sp/>continue<sp/>it<sp/>with<sp/>more<sp/>work,</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>then<sp/>wait<sp/>for<sp/>it<sp/>to<sp/>complete</highlight><highlight class="normal"></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/><ref refid="namespace_system_1_1_threading_1_1_tasks_1a05fc9184b921cd487b58596906311df5" kindref="member">TaskCreationOptions</ref>.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><highlight class="normal"></highlight></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/></highlight><highlight class="keywordflow">while</highlight><highlight class="normal">(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/></highlight><highlight class="comment">//<sp/>fade<sp/>out</highlight><highlight class="normal"></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/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>FiberInstruction.YieldToAnyFiber;</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal">IEnumerator<sp/>DoMoreWork()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="comment">//<sp/>do<sp/>work</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
</programlisting> </para>
    </detaileddescription>
  </compounddef>
</doxygen>
