ThreadPool.QueueUserWorkItem Multi-threading

By Robbe Morris

Here is a barebone code example of how to use the ThreadPool to queue up tasks in a multi-threaded environment. It uses ThreadPool.GetMaxThreads, ThreadPool.SetMaxThreads, and ManualResetEvent.

using System;
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;

namespace MyTest
{
class Tester
{

private static List<ManualResetEvent> _waitHandles = null;

static void Main(string[] args)
{

int defaultMaxworkerThreads = 0;
int defaultmaxIOThreads = 0;
int waitHandleIndex = 0;
int maxThreadsAtOnce = 35;

try
{

_waitHandles = new List<ManualResetEvent>();
waitHandleIndex = 0;

ThreadPool.GetMaxThreads(out defaultMaxworkerThreads, out defaultmaxIOThreads);
ThreadPool.SetMaxThreads(defaultMaxworkerThreads, defaultmaxIOThreads);

int start = 0;

for (int i = start; i < 5000000; i++)
{

Console.WriteLine(i.ToString());

var resetEvent = new ManualResetEvent(false);
var controller = new MyTestJob(waitHandleIndex);

ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(OnThreadedDataRequest), controller);

waitHandleIndex++;
_waitHandles.Add(resetEvent);

if (_waitHandles.Count >= maxThreadsAtOnce)
{
System.Threading.WaitHandle.WaitAll(_waitHandles.ToArray<ManualResetEvent>());
_waitHandles = new List<ManualResetEvent>();
waitHandleIndex = 0;
}

}

if (_waitHandles.Count > 0) System.Threading.WaitHandle.WaitAll(_waitHandles.ToArray<ManualResetEvent>());

}
catch (Exception ex)
{
Debug.WriteLine(ex.Message + " " + ex.StackTrace);
}

Console.WriteLine("done");
Console.ReadLine();
}

public static void OnThreadedDataRequest(object sender)
{
var controller = sender as MyTestJob;
if (controller == null) return;
controller.Execute();
_waitHandles[controller.WaitHandleIndex].Set();
}

}

public class MyTestJob
{

public int WaitHandleIndex = 0;

public MyTestJob(int waitHandleIndex)
{
WaitHandleIndex = waitHandleIndex;
// Add input parameters to the constructor to store input variables in class level variables
// for use by the Execute method below.
}

public void Execute()
{

try
{
Console.WriteLine(WaitHandleIndex.ToString() + " - " + DateTime.Now.ToString());
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message + " " + ex.StackTrace);
}

}
}

}

ThreadPool.QueueUserWorkItem Multi-threading  (6827 Views)