private void CheckThreadState(ref Thread thread, ref int threadIL, Crestron.SimplSharpPro.CrestronThread.ThreadCallbackFunction method, string methodname)
 {
     if (fw.EventsEnabled)
     {
         if (Interlocked.CompareExchange(ref threadIL, 1, 0) == 0)
         {
             thread = new Thread(method, null, Thread.eThreadStartOptions.Running);
         }
         else
         {
             //CrestronConsole.PrintLine("- didn't start new " + methodname + " - thread already running");
         }
     }
 }
 public ThreadEx(Crestron.SimplSharpPro.CrestronThread.ThreadCallbackFunction threadCallbackFunc, object userDefinedObject,
                 Crestron.SimplSharpPro.CrestronThread.Thread.eThreadStartOptions threadStartOption)
     : base(threadCallbackFunc, userDefinedObject, threadStartOption)
 {
     _threadExId = Interlocked.Increment(ref _lastExId) | (long)(_threadExId == 0 ? Interlocked.Increment(ref _lastExIdHigh) : _lastExIdHigh) << 32;
 }