<?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="unity-integration_8md" kind="file" language="Markdown">
    <compoundname>unity-integration.md</compoundname>
    <briefdescription>
    </briefdescription>
    <detaileddescription>
    </detaileddescription>
    <programlisting>
<codeline><highlight class="normal">Unity<sp/>Integration</highlight></codeline>
<codeline><highlight class="normal">=================</highlight></codeline>
<codeline><highlight class="normal">The<sp/>**SpicyPixel.Threading.Unity.dll**<sp/>assembly<sp/>provides<sp/>functionality<sp/>to<sp/>integrate<sp/>the<sp/>[Fiber](@ref<sp/>SpicyPixel.Threading.Fiber)<sp/>and<sp/>Task<sp/>features<sp/>of<sp/>the<sp/>Concurrency<sp/>Kit<sp/>with<sp/>the<sp/>Unity<sp/>coroutine<sp/>scheduler.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">MonoBehaviour<sp/>Extensions</highlight></codeline>
<codeline><highlight class="normal">------------------------</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">###<sp/>Using<sp/>ConcurrentBehaviour</highlight></codeline>
<codeline><highlight class="normal">The<sp/>[ConcurrentBehavior](@ref<sp/>SpicyPixel.Threading.ConcurrentBehaviour)<sp/>class<sp/>extends<sp/>MonoBehaviour<sp/>with<sp/>additional<sp/>properties<sp/>to<sp/>make<sp/>it<sp/>easy<sp/>to<sp/>access<sp/>the<sp/>scheduler<sp/>associated<sp/>with<sp/>the<sp/>behaviour.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">public<sp/>class<sp/>MyBehaviour<sp/>:<sp/>ConcurrentBehaviour</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>//<sp/>If<sp/>your<sp/>code<sp/>requires<sp/>Awake(),<sp/>always<sp/>override<sp/>the<sp/>base</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>//<sp/>because<sp/>this<sp/>is<sp/>where<sp/>the<sp/>schedulers<sp/>are<sp/>setup<sp/>to<sp/>ensure</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>//<sp/>the<sp/>correct<sp/>thread<sp/>is<sp/>selected.</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>override<sp/>void<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/>//<sp/>Do<sp/>custom<sp/>logic</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>void<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>
<codeline><highlight class="normal">```</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">###<sp/>Managing<sp/>scheduler<sp/>creation</highlight></codeline>
<codeline><highlight class="normal">If<sp/>it<sp/>is<sp/>not<sp/>convenient<sp/>to<sp/>extend<sp/>your<sp/>behaviour<sp/>from<sp/>[ConcurrentBehavior](@ref<sp/>SpicyPixel.Threading.ConcurrentBehaviour),<sp/>you<sp/>can<sp/>create<sp/>factory<sp/>and<sp/>scheduler<sp/>instances<sp/>by<sp/>invoking<sp/>one<sp/>of<sp/>the<sp/>extension<sp/>methods<sp/>in<sp/>[UnityTaskExtensions](@ref<sp/>SpicyPixel.Threading.Tasks.UnityTaskExtensions).</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">public<sp/>class<sp/>MyBehaviour<sp/>:<sp/>MonoBehaviour</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>private<sp/>TaskFactory<sp/>customTaskFactory;</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>void<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/>void<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>
<codeline><highlight class="normal">```</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">###<sp/>Shared<sp/>factory</highlight></codeline>
<codeline><highlight class="normal">You<sp/>can<sp/>use<sp/>[UnityTaskFactory](@ref<sp/>SpicyPixel.Threading.Tasks.UnityTaskFactory)<sp/>to<sp/>access<sp/>a<sp/>shared<sp/>factory<sp/>instance<sp/>which<sp/>ultimately<sp/>relies<sp/>on<sp/>the<sp/>shared<sp/>[ConcurrentBehavior](@ref<sp/>SpicyPixel.Threading.ConcurrentBehaviour)<sp/>instance.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">public<sp/>class<sp/>MyBehaviour<sp/>:<sp/>MonoBehaviour</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>void<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>
<codeline><highlight class="normal">```</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Synchronization<sp/>Context</highlight></codeline>
<codeline><highlight class="normal">-----------------------</highlight></codeline>
<codeline><highlight class="normal">The<sp/>[UnitySynchronizationContext](@ref<sp/>SpicyPixel.Threading.UnitySynchronizationContext)<sp/>is<sp/>a<sp/>convenient<sp/>way<sp/>to<sp/>integrate<sp/>with<sp/>code<sp/>which<sp/>relies<sp/>on<sp/>a<sp/>[SynchronizationContext](https://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext(v=vs.110).aspx)<sp/>or<sp/>to<sp/>post<sp/>operations<sp/>back<sp/>to<sp/>the<sp/>calling<sp/>thread<sp/>in<sp/>a<sp/>scheduler<sp/>agnostic<sp/>manner.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">public<sp/>class<sp/>MyBehaviour<sp/>:<sp/>MonoBehaviour</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>void<sp/>Awake()</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<sp/>Install<sp/>this<sp/>once<sp/>at<sp/>startup<sp/>in<sp/>a<sp/>single<sp/>behaviour<sp/>to</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<sp/>initialize<sp/>the<sp/>context<sp/>for<sp/>the<sp/>main<sp/>thread.</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/>//<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></codeline>
<codeline><highlight class="normal"><sp/><sp/>//<sp/>but<sp/>which<sp/>needs<sp/>to<sp/>process<sp/>results<sp/>on<sp/>a<sp/>timer.</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>void<sp/>ProcessResults()</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<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></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<sp/>so<sp/>we<sp/>can<sp/>use<sp/>it<sp/>for<sp/>callback.</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/>//<sp/>Start<sp/>a<sp/>timer</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>new<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/>//<sp/>Do<sp/>something<sp/>on<sp/>a<sp/>timer<sp/>thread</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>void<sp/>TimerCallback(object<sp/>state)</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<sp/>Get<sp/>the<sp/>sync<sp/>context<sp/>for<sp/>the<sp/>thread<sp/>that<sp/>created</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<sp/>the<sp/>timer.<sp/>Technically<sp/>we<sp/>could<sp/>have<sp/>referenced</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<sp/>UnitySynchronizationContext.SharedInstance<sp/>since</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<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></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<sp/>but<sp/>this<sp/>is<sp/>the<sp/>typical<sp/>pattern<sp/>you<sp/>would<sp/>use<sp/>to<sp/>write</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<sp/>scheduler<sp/>agnostic<sp/>code.</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/>//<sp/>We<sp/>are<sp/>running<sp/>in<sp/>a<sp/>timer<sp/>thread<sp/>here.</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/></highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<sp/>Now,<sp/>run<sp/>something<sp/>back<sp/>on<sp/>the<sp/>thread<sp/>that<sp/>started<sp/>the<sp/>timer</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(&quot;Back<sp/>on<sp/>the<sp/>Unity<sp/>thread&quot;);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>},<sp/>null);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline><highlight class="normal">```</highlight></codeline>
    </programlisting>
    <location file="Docs/unity-integration.md"/>
  </compounddef>
</doxygen>
