<?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_unity-integration" kind="page">
    <compoundname>md_Docs_unity-integration</compoundname>
    <title>Unity Integration</title>
    <briefdescription>
    </briefdescription>
    <detaileddescription>
<para>The <bold>SpicyPixel.Threading.Unity.dll</bold> assembly provides functionality to integrate the <ref refid="class_spicy_pixel_1_1_threading_1_1_fiber" kindref="compound">Fiber</ref> and Task features of the Concurrency Kit with the Unity coroutine scheduler.</para>
<para><heading level="2">MonoBehaviour Extensions </heading>
</para>
<para><heading level="3">Using ConcurrentBehaviour</heading>
</para>
<para>The <ref refid="class_spicy_pixel_1_1_threading_1_1_concurrent_behaviour" kindref="compound">ConcurrentBehavior</ref> class extends MonoBehaviour with additional properties to make it easy to access the scheduler associated with the behaviour.</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">MyBehaviour<sp/>:<sp/>ConcurrentBehaviour</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="comment">//<sp/>If<sp/>your<sp/>code<sp/>requires<sp/>Awake(),<sp/>always<sp/>override<sp/>the<sp/>base</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="comment">//<sp/>because<sp/>this<sp/>is<sp/>where<sp/>the<sp/>schedulers<sp/>are<sp/>setup<sp/>to<sp/>ensure</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="comment">//<sp/>the<sp/>correct<sp/>thread<sp/>is<sp/>selected.</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="keyword">override</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>Awake()</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>base.Awake();</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Do<sp/>custom<sp/>logic</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>Update()</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>taskFactory.StartNew(()<sp/>=&gt;<sp/>DoWorkOnUnityThread()).</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/>ContinueWith((t)<sp/>=&gt;<sp/>DoMoreWorkOnUnityThread(),<sp/>taskScheduler);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
</programlisting></para>
<para><heading level="3">Managing scheduler creation</heading>
</para>
<para>If it is not convenient to extend your behaviour from <ref refid="class_spicy_pixel_1_1_threading_1_1_concurrent_behaviour" kindref="compound">ConcurrentBehavior</ref>, you can create factory and scheduler instances by invoking one of the extension methods in <ref refid="class_spicy_pixel_1_1_threading_1_1_tasks_1_1_unity_task_extensions" kindref="compound">UnityTaskExtensions</ref>.</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">MyBehaviour<sp/>:<sp/>MonoBehaviour</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="keyword">private</highlight><highlight class="normal"><sp/>TaskFactory<sp/>customTaskFactory;</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>Awake()</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>customTaskFactory<sp/>=<sp/>this.CreateTaskFactory();</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>Update()</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>customTaskFactory.StartNew(()<sp/>=&gt;<sp/>DoWorkOnUnityThread()).</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/>ContinueWith((t)<sp/>=&gt;<sp/>DoMoreWorkOnUnityThread(),<sp/>customTaskFactory.Scheduler);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
</programlisting></para>
<para><heading level="3">Shared factory</heading>
</para>
<para>You can use <ref refid="class_spicy_pixel_1_1_threading_1_1_tasks_1_1_unity_task_factory" kindref="compound">UnityTaskFactory</ref> to access a shared factory instance which ultimately relies on the shared <ref refid="class_spicy_pixel_1_1_threading_1_1_concurrent_behaviour" kindref="compound">ConcurrentBehavior</ref> instance.</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">MyBehaviour<sp/>:<sp/>MonoBehaviour</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>Update()</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>UnityTaskFactory.Default.StartNew(()<sp/>=&gt;<sp/>DoWorkOnUnityThread()).</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/>ContinueWith((t)<sp/>=&gt;<sp/>DoMoreWorkOnUnityThread(),<sp/>UnityTaskScheduler.Default);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
</programlisting></para>
<para><heading level="2">Synchronization Context </heading>
</para>
<para>The <ref refid="class_spicy_pixel_1_1_threading_1_1_unity_synchronization_context" kindref="compound">UnitySynchronizationContext</ref> is a convenient way to integrate with code which relies on a <ulink url="https://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext(v=vs.110).aspx">SynchronizationContext</ulink> or to post operations back to the calling thread in a scheduler agnostic manner.</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">MyBehaviour<sp/>:<sp/>MonoBehaviour</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>Awake()</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Install<sp/>this<sp/>once<sp/>at<sp/>startup<sp/>in<sp/>a<sp/>single<sp/>behaviour<sp/>to</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>initialize<sp/>the<sp/>context<sp/>for<sp/>the<sp/>main<sp/>thread.</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>SynchronizationContext.SetSynchronizationContext(</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>UnitySynchronizationContext.SharedInstance);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="comment">//<sp/>This<sp/>example<sp/>method<sp/>might<sp/>be<sp/>invoked<sp/>by<sp/>something<sp/>from<sp/>the<sp/>Unity<sp/>thread</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="comment">//<sp/>but<sp/>which<sp/>needs<sp/>to<sp/>process<sp/>results<sp/>on<sp/>a<sp/>timer.</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>ProcessResults()</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Save<sp/>the<sp/>current<sp/>thread&apos;s<sp/>sync<sp/>context<sp/>before<sp/>we<sp/>enter<sp/>the<sp/>timer</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>so<sp/>we<sp/>can<sp/>use<sp/>it<sp/>for<sp/>callback.</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>var<sp/>syncContext<sp/>=<sp/>SynchronizationContext.Current;</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Start<sp/>a<sp/>timer</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">new</highlight><highlight class="normal"><sp/>Timer(TimerCallback,<sp/>syncContext,<sp/>TimeSpan.FromSeconds(3),<sp/>TimeSpan.Zero);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="comment">//<sp/>Do<sp/>something<sp/>on<sp/>a<sp/>timer<sp/>thread</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>TimerCallback(</highlight><highlight class="keywordtype">object</highlight><highlight class="normal"><sp/>state)</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Get<sp/>the<sp/>sync<sp/>context<sp/>for<sp/>the<sp/>thread<sp/>that<sp/>created</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>the<sp/>timer.<sp/>Technically<sp/>we<sp/>could<sp/>have<sp/>referenced</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>UnitySynchronizationContext.SharedInstance<sp/>since</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>we<sp/>know<sp/>that<sp/>is<sp/>the<sp/>thread<sp/>we<sp/>want<sp/>to<sp/>send<sp/>back<sp/>to,</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>but<sp/>this<sp/>is<sp/>the<sp/>typical<sp/>pattern<sp/>you<sp/>would<sp/>use<sp/>to<sp/>write</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>scheduler<sp/>agnostic<sp/>code.</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>var<sp/>syncContext<sp/>=<sp/>state<sp/>as<sp/>SynchronizationContext;</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>We<sp/>are<sp/>running<sp/>in<sp/>a<sp/>timer<sp/>thread<sp/>here.</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Now,<sp/>run<sp/>something<sp/>back<sp/>on<sp/>the<sp/>thread<sp/>that<sp/>started<sp/>the<sp/>timer</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>syncContext.Send((moreState)<sp/>=&gt;<sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/>Debug.Log(</highlight><highlight class="stringliteral">&quot;Back<sp/>on<sp/>the<sp/>Unity<sp/>thread&quot;</highlight><highlight class="normal">);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>},<sp/></highlight><highlight class="keyword">null</highlight><highlight class="normal">);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
</programlisting> </para>
    </detaileddescription>
  </compounddef>
</doxygen>
