diff options
Diffstat (limited to 'Playground/Assets/ConsolePro/Remote/LiteNetLib/NetThread.cs')
-rw-r--r-- | Playground/Assets/ConsolePro/Remote/LiteNetLib/NetThread.cs | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/Playground/Assets/ConsolePro/Remote/LiteNetLib/NetThread.cs b/Playground/Assets/ConsolePro/Remote/LiteNetLib/NetThread.cs new file mode 100644 index 0000000..cdd433f --- /dev/null +++ b/Playground/Assets/ConsolePro/Remote/LiteNetLib/NetThread.cs @@ -0,0 +1,97 @@ +#if DEBUG && !UNITY_WP_8_1 && !UNITY_WSA +#if WINRT && !UNITY_EDITOR +#define USE_WINRT +#endif + +using System; +using System.Threading; + +#if USE_WINRT +using Windows.Foundation; +using Windows.System.Threading; +using Windows.System.Threading.Core; +#endif + +namespace FlyingWormConsole3.LiteNetLib +{ + public sealed class NetThread + { +#if USE_WINRT + private readonly ManualResetEvent _updateWaiter = new ManualResetEvent(false); + private readonly ManualResetEvent _joinWaiter = new ManualResetEvent(false); +#else + private Thread _thread; +#endif + + private readonly Action _callback; + + public int SleepTime; + private bool _running; + private readonly string _name; + + public bool IsRunning + { + get { return _running; } + } + + public NetThread(string name, int sleepTime, Action callback) + { + _callback = callback; + SleepTime = sleepTime; + _name = name; + } + + public void Start() + { + if (_running) + return; + _running = true; +#if USE_WINRT + var thread = new PreallocatedWorkItem(ThreadLogic, WorkItemPriority.Normal, WorkItemOptions.TimeSliced); + thread.RunAsync().AsTask(); +#else + _thread = new Thread(ThreadLogic) + { + Name = _name, + IsBackground = true + }; + _thread.Start(); +#endif + } + + public void Stop() + { + if (!_running) + return; + _running = false; + +#if USE_WINRT + _joinWaiter.WaitOne(); +#else + _thread.Join(); +#endif + } + +#if USE_WINRT + private void ThreadLogic(IAsyncAction action) + { + while (_running) + { + _callback(); + _updateWaiter.WaitOne(SleepTime); + } + _joinWaiter.Set(); + } +#else + private void ThreadLogic() + { + while (_running) + { + _callback(); + Thread.Sleep(SleepTime); + } + } +#endif + } +} +#endif |