summaryrefslogtreecommitdiff
path: root/Playground/Assets/ConsolePro/Remote/LiteNetLib/NetThread.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Playground/Assets/ConsolePro/Remote/LiteNetLib/NetThread.cs')
-rw-r--r--Playground/Assets/ConsolePro/Remote/LiteNetLib/NetThread.cs97
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