Разница между ThreadPool.QueueUserWorkItem и параллельно.По каждому элементу?
в чем основное различие между двумя из следующих подходов:
класса ThreadPool.Метод queueuserworkitem
Clients objClient = new Clients();
List<Clients> objClientList = Clients.GetClientList();
foreach (var list in objClientList)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(SendFilesToClient), list);
}
1 ответов
основное отличие функционально. Parallel.ForEach
будет блокировать (по дизайну), поэтому он не вернется, пока все объекты не будут обработаны. Ваш foreach
работа потока очереди threadpool будет толкать работу на фоновые потоки, а не блокировать.
и Parallel.ForEach
версия будет иметь еще одно важное преимущество - необработанные исключения будут возвращены на сайт вызовов здесь, а не оставлены необработанными в потоке ThreadPool.
в общем, Parallel.ForEach
будет больше эффективный. Оба варианта используют ThreadPool, но Parallel.ForEach
делает умный перегородки, чтобы предотвратить overthreading и снизить сумму издержек, связанных с планировщик. Отдельные задачи( которые будут сопоставляться потокам ThreadPool) повторно используются и эффективно "объединяются" для снижения накладных расходов, особенно если SendFilesToClient
- это быстрая операция (которая, в данном случае, не будет правдой).
обратите внимание, что вы также можете в качестве третьего варианта использовать PLINQ:
objClientList.AsParallel().ForAll(SendFilesToClient);
это будет очень похожий к Parallel.ForEach
метод с точки зрения производительности и функциональности.