Don't re-allocate the callback delegates each time we call ThreadPool.QueueUserWorkItem; create the delegates once, then pass arguments in via another overload of QueueUserWorkItem.