public void TestMultiThreaded() { int numberOfThreadsComplete = 0; bool[] found = new bool[100]; for (int i = 0; i < found.Length; i++) { found[0] = false; } ConcurrentLinkedQueue <string> queue = new ConcurrentLinkedQueue <string>(); for (int i = 0; i < found.Length; i++) { ThreadPool.QueueUserWorkItem((object obj) => { int num = (int)obj; queue.Enqueue("" + num); found[num] = true; Interlocked.Increment(ref numberOfThreadsComplete); }, i); } DateTime startTime = DateTime.Now; while (DateTime.Now.Subtract(startTime).TotalSeconds < 5 && numberOfThreadsComplete < found.Length) { // do nothing } for (int i = 0; i < found.Length; i++) { Assert.IsTrue(found[i]); } string value; while (queue.Dequeue(out value)) { found[int.Parse(value)] = false; } for (int i = 0; i < found.Length; i++) { Assert.IsFalse(found[i]); } }
public void TestSingleThreaded() { ConcurrentLinkedQueue <string> queue = new ConcurrentLinkedQueue <string>(); queue.Enqueue("one"); queue.Enqueue("two"); queue.Enqueue("three"); string value; Assert.IsTrue(queue.Dequeue(out value)); Assert.AreEqual("one", value); Assert.IsTrue(queue.Dequeue(out value)); Assert.AreEqual("two", value); Assert.IsTrue(queue.Dequeue(out value)); Assert.AreEqual("three", value); Assert.IsFalse(queue.Dequeue(out value)); }
public void TestMultiThreadedComplex() { ConcurrentLinkedQueue <int> queue = new ConcurrentLinkedQueue <int>(); int count = 0; BlockingCollection <int> pooledObjects = new BlockingCollection <int>(); for (int i = 0; i < 100; i++) { Interlocked.Increment(ref count); ThreadPool.QueueUserWorkItem((object state) => { try { queue.Enqueue((int)state); } catch (Exception e) { Console.WriteLine("Error: " + e); } }, count); Interlocked.Increment(ref count); ThreadPool.QueueUserWorkItem((object state) => { try { queue.Enqueue((int)state); } catch (Exception e) { Console.WriteLine("Error: " + e); } }, count); ThreadPool.QueueUserWorkItem((object state) => { try { int val; while (!queue.Dequeue(out val)) { } } catch (Exception e) { Console.WriteLine("Error: " + e); } Interlocked.Decrement(ref count); }); Interlocked.Increment(ref count); ThreadPool.QueueUserWorkItem((object state) => { try { queue.Enqueue((int)state); } catch (Exception e) { Console.WriteLine("Error: " + e); } }, count); ThreadPool.QueueUserWorkItem((object state) => { try { int val; while (!queue.Dequeue(out val)) { } } catch (Exception e) { Console.WriteLine("Error: " + e); } Interlocked.Decrement(ref count); }); ThreadPool.QueueUserWorkItem((object state) => { try { int val; while (!queue.Dequeue(out val)) { } } catch (Exception e) { Console.WriteLine("Error: " + e); } Interlocked.Decrement(ref count); }); } DateTime startTime = DateTime.Now; while (count > 0 && DateTime.Now.Subtract(startTime).TotalSeconds < 10) { Console.WriteLine("Current count: " + count); Thread.Sleep(1); } Assert.AreEqual(0, count); Assert.AreEqual(0, queue.Count); //Assert.AreEqual(pool.TotalNumberOfObjects, pool.ObjectsInPool); }