ThreadPool.QueueUserWorkItem
Пример со страницы документации:
using System;
using System.Threading;
public class Example {
public static void Main() {
// Queue the task.
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));
Console.WriteLine("Main thread does some work, then sleeps.");
// If you comment out the Sleep, the main thread exits, and
// therefore the application ends, before the work item
// runs on the thread pool thread. The thread pool uses background
// threads, which do not keep the application running. (This
// is a simple example of a race condition.)
Thread.Sleep(1000);
Console.WriteLine("Main thread exits.");
}
// This method performs the work. It will be invoked in a thread
// running in the .NET threadpool.
static void ThreadProc(Object stateInfo) {
// No state object was passed to QueueUserWorkItem, so
// stateInfo is null.
Console.WriteLine("Hello from the thread pool.");
}
}
В вашем сценарии вы можете просто поставить в очередь все рабочие элементы из различных списков.Нет гарантии порядка обработки с пулом потоков.Однако, если выполняемая работа довольно «коротка», то есть, если время, необходимое для отправки потока, «примерно такое же, как» время, необходимое для выполнения фактической работы, тогда вы можете перетасовать действия так, чтобыобеспечить более справедливый шанс среди всех потоков пула потоков.
Если ваши действия выполняются в течение длительного времени - скажем, десятки секунд или более - тогда пул потоков обеспечит хорошую справедливость в любом случае, и при условии отсутствия конфликтов между потоками, вам, вероятно, не нужно будет перетасовывать рабочие элементы.прежде чем поставить их в очередь.