Разница между 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 метод с точки зрения производительности и функциональности.