internal void Dequeue_messages(TryDequeueDelegate <T> trydequeue, Func <bool> isRunning)
        {
            var msg = default(T);

            do
            {
                if (trydequeue(out msg))
                {
                    Dequeued(msg);
                }
                else
                {
                    _resource.Wait(Timeout.Infinite);
                }
            } while(isRunning());
        }
 internal void Start(Action <TryDequeueDelegate <T>, Func <bool> > backgroundTask, TryDequeueDelegate <T> trydequeue)
 {
     if (_th == null)
     {
         _th = new Thread(() => backgroundTask(trydequeue, () => _running));
         _th.IsBackground = true;
         _running         = true;
         _th.Start();
     }
 }
 public void Start(TryDequeueDelegate <T> trydequeue)
 {
     Start(Dequeue_messages, trydequeue);
 }