public void TestThreadPoolPausedAndResumed() { threadPool = new ThreadPool(Environment.ProcessorCount, "testWorker"); var wirs = new List <IWorkItemState>(); for (var i = 0; i < 10; i++) { if (i == 5) { threadPool.Sleep(); Thread.Sleep(2000); } var wir = threadPool.EnqueueWorkItem(WriteToConsole, "test " + (i + 1)); wirs.Add(wir); } threadPool.Wakeup(); foreach (var workItemState in wirs) { workItemState.Result(); workItemState.Dispose(); } threadPool.ShutDown(); }
public void TestThreadPoolManyThreadsActionTNumberOfCalls() { threadPool = new ThreadPool(Environment.ProcessorCount, "testWorker"); var wirs = new List <IWorkItemState>(); var objects = new List <ThreadingThreadpoolTestObject>(); for (var j = 0; j < 5000; j++) { wirs.Clear(); objects.Clear(); for (var i = 0; i < 100; i++) { var o = new ThreadingThreadpoolTestObject(); objects.Add(o); var wir = threadPool.EnqueueWorkItem(o.Call); wirs.Add(wir); } foreach (var workItemState in wirs) { workItemState.Result(); workItemState.Dispose(); } foreach (var threadingThreadpoolTestObject in objects) { Assert.AreEqual(1, threadingThreadpoolTestObject.NumberOfCalls, "One of the objects has been called " + threadingThreadpoolTestObject.NumberOfCalls + " times. It was expected to be called once only and exactly once."); } } threadPool.ShutDown(); }
public void TestThreadPoolManyWorkItemsSingleThread() { threadPool = new ThreadPool(1, "testWorker"); var wirs = new List <IWorkItemState <bool> >(); for (var i = 0; i < 50; i++) { var wir = threadPool.EnqueueWorkItem(Not, i % 2 == 1); wirs.Add(wir); } var anticipatedResult = true; foreach (var workItemState in wirs) { var result = workItemState.Result; workItemState.Dispose(); Assert.AreEqual(result, anticipatedResult); anticipatedResult = !anticipatedResult; } threadPool.ShutDown(); }
public void TestThreadPoolManyThreadsActionTWithCallback() { threadPool = new ThreadPool(Environment.ProcessorCount, "testWorker"); var wirs = new List <IWorkItemState>(); for (var i = 0; i < 50; i++) { var wir = threadPool.EnqueueWorkItem(WriteToConsole, "test", CallbackFunction); wirs.Add(wir); } foreach (var workItemState in wirs) { workItemState.Result(); workItemState.Dispose(); } threadPool.ShutDown(); }
public void TestThreadPoolManyThreadsFuncT() { threadPool = new ThreadPool(Environment.ProcessorCount, "testWorker"); var wirs = new List <IWorkItemState <bool> >(); for (var i = 0; i < 50; i++) { var wir = threadPool.EnqueueWorkItem(Not, true); wirs.Add(wir); } foreach (var workItemState in wirs) { var result = workItemState.Result; workItemState.Dispose(); Assert.AreEqual(result, false); } threadPool.ShutDown(); }
public void TestThreadPoolPerformance() { const int numberOfOperations = 100000; var ssw = new SplitStopwatch(); // Test without any threadPool. ssw.Start("SINGLE THREADED WITHOUT POOL:"); for (var i = 0; i < numberOfOperations; i++) { CalcAverage(GetNumbersForAverage()); } ssw.Stop("Done.", 1); Console.Out.WriteLine(string.Empty); ssw.Reset(); for (var numberOfWorkerThreads = 1; numberOfWorkerThreads < Environment.ProcessorCount * 2; numberOfWorkerThreads++) { ssw.Start("THREADPOOL (" + numberOfWorkerThreads + " workerThreads):"); threadPool = new ThreadPool(numberOfWorkerThreads, "testWorker"); ssw.Split("Starting to enqueue.", 1); for (var i = 0; i < numberOfOperations; i++) { threadPool.EnqueueWorkItem(CalcAverage, GetNumbersForAverage()); } ssw.Split("All items are enqueued.", 1); threadPool.WaitForEveryWorkerIdle(); threadPool.ShutDown(); ssw.Stop("Done.", 1); Console.Out.WriteLine(string.Empty); ssw.Reset(); } }
public void TestThreadPool() { threadPool = new ThreadPool(Environment.ProcessorCount, "testWorker"); var ssw = new SplitStopwatch(); ssw.Start("starting to enqueue..."); var wir1 = threadPool.EnqueueWorkItem(CalcAverage, new[] { 2, 3, 2, 5 }); var wir2 = threadPool.EnqueueWorkItem(CalcAverage, new[] { 1, 1, 1, 1 }); var wir3 = threadPool.EnqueueWorkItem(CalcAverage, new[] { 2, 3, 2, 5 }); var wir4 = threadPool.EnqueueWorkItem(CalcAverage, new[] { 2, 3, 2, 5 }); var wir5 = threadPool.EnqueueWorkItem(CalcAverage, new[] { 2, 3, 2, 5 }); var wir6 = threadPool.EnqueueWorkItem(CalcAverage, new[] { 2, 3, 2, 5 }); var wir7 = threadPool.EnqueueWorkItem(CalcAverage, new[] { 2, 3, 2, 5 }); var wir8 = threadPool.EnqueueWorkItem(CalcAverage, new[] { 2, 3, 2, 5 }); var wir9 = threadPool.EnqueueWorkItem(CalcAverage, new[] { 2, 3, 2, 5 }); var wir10 = threadPool.EnqueueWorkItem(CalcAverage, new[] { 2, 3, 2, 5 }); ssw.Split("all items are enqueued..."); var average = wir1.Result; Assert.AreEqual(average, 3.0); ssw.Split("we waited for result 1..."); wir1.Dispose(); average = wir2.Result; Assert.AreEqual(average, 1.0); ssw.Split("we waited for result 2..."); wir2.Dispose(); average = wir3.Result; Assert.AreEqual(average, 3.0); ssw.Split("we waited for result 3..."); wir3.Dispose(); average = wir4.Result; Assert.AreEqual(average, 3.0); ssw.Split("we waited for result 4..."); wir4.Dispose(); average = wir5.Result; Assert.AreEqual(average, 3.0); ssw.Split("we waited for result 5..."); wir5.Dispose(); average = wir6.Result; Assert.AreEqual(average, 3.0); ssw.Split("we waited for result 6..."); wir6.Dispose(); average = wir7.Result; Assert.AreEqual(average, 3.0); ssw.Split("we waited for result 7..."); wir7.Dispose(); average = wir8.Result; Assert.AreEqual(average, 3.0); ssw.Split("we waited for result 8..."); wir8.Dispose(); average = wir9.Result; Assert.AreEqual(average, 3.0); ssw.Split("we waited for result 9..."); wir9.Dispose(); average = wir10.Result; Assert.AreEqual(average, 3.0); ssw.Split("we waited for result 10..."); wir10.Dispose(); var wir11 = threadPool.EnqueueWorkItem(CalcAverage, new[] { 2, 3, 2, 5 }); average = wir11.Result; Assert.AreEqual(average, 3.0); ssw.Split("we waited for result 11..."); wir11.Dispose(); threadPool.ShutDown(); }