Multi Threading Concerns
ThreadSafeQueue is a nice way to handle multi threading, but I needed something more.
I want to use this to speed up UI responsiveness, so this means that I need some way to test whatever an object exist in the queue without waiting (that would defeat the whole point, wouldn't it?).
I wanted to be able to do something like:
        object o;
        do
        {
o = q.TryDequeue();
                
        }while(o == null);
Here are my additions to the class:
Test:
        #region TryDequeueWithWorkerThreadsReturnSameNumberOnItems
                
        [Test]
        public void TryDequeueWithWorkerThreadsReturnSameNumberOnItems()
        {
              int objectCount=0, createdObjects= 100;
              ThreadStart ts = new ThreadStart(TryDeuqueWorkerThread);
              Thread first = new Thread(ts),second = new Thread(ts);
              first.Start();
              second.Start();
              for (int i = 0; i < createdObjects; i++)
              {
                    q.Enqueue(new object());
              }
              runThread = false;
              first.Join();
              second.Join();
              while(q.TryDequeue()!=null)
                    objectCount++;
              Assert.AreEqual(createdObjects,objectCount,"Got a different amount of objects than those created");
                
        }
                
        private void TryDeuqueWorkerThread()
        {
              object o;
              while(runThread)
              {
                    o = q.TryDequeue();
                    if(o!=null)
                          itemsQueue.Enqueue(o);
              }
        }
                
Code:
        /// <summary>
        /// Resets the event if needed.
        /// Only called when we have lock!
        /// </summary>
        private void ResetEventIfNeeded()
        {
              if (q.Count == 0)
                    newItemEntered.Reset();
        }
                
        public object TryDequeue()
        {
              if (q.Count > 0)
              {
                    lock (this)
                    {
                          if (q.Count > 0)
                          {
                                object result = q.Dequeue();
                                ResetEventIfNeeded();
                                return result;
                          }
                    }
              }
              return null;
 

Comments
Comment preview