Подтвердить что ты не робот

TaskFactory.StartNew против ThreadPool.QueueUserWorkItem

По-видимому, метод TaskFactory.StartNew в .NET 4.0 предназначен для замены ThreadPool.QueueUserWorkItem (в соответствии с этим сообщением, в любом случае). Мой вопрос прост: кто-нибудь знает, почему?

Имеет ли TaskFactory.StartNew лучшую производительность? Использует ли он меньше памяти? Или это в основном для дополнительных функций, предоставляемых классом Task? В последнем случае StartNew может иметь худшую производительность, чем QueueUserWorkItem?

Мне кажется, что StartNew фактически потенциально будет использовать больше памяти, чем QueueUserWorkItem, так как он возвращает объект Task с каждым вызовом, и я ожидаю, что это приведет к большему распределению памяти.

В любом случае мне интересно узнать, что более подходит для высокопроизводительного сценария.

4b9b3361

Ответ 1

Производительность... зависит. Если вы выполняете множество параллельных задач, то задачи .net 4 будут работать лучше, плюс вы получите более тонкий контроль (более надежное отключение, возможность ожидания нескольких задач одновременно, возможность создания отношений родительских/дочерних задач, возможность укажите LongRunning, и т.д.. и т.д. и т.д.)

Кроме того, возможность указать свой собственный TaskScheduler означает, что вы можете настроить его для своих нужд. Встроенный планировщик задач гораздо более многоядерный, чем старый ThreadPool.

Что касается использования большего объема памяти. Каждый поток резервирует минимум 1 МБ памяти, крошечная сумма, используемая для хранения объекта задачи, несущественна. Я действительно думаю, что последнее из ваших забот.

Ответ 2

TaskFactory.StartNew более подходит для сценария высокой производительности.

Вы получаете преимущество в производительности от набора классов в System.Threading.Tasks и заботы, которые вошли в их дизайн + интеграция с параллельными циклами и параметрами.

Вы также получите преимущество в производительности, так как System.Threading.Tasks создаются поверх работы, крадущейся в пуле потоков, который лучше подходит для местоположения (когда это имеет значение).

-Rick

Ответ 3

С точки зрения вещей классы Task были разработаны для работы с новыми параллельными функциями в .Net 4. Похоже, вы можете использовать Action или Action<T> непосредственно при запуске/создании задачи. Это все 100% -ная догадка, хотя, основываясь на том, что тыкаешь вокруг документов:).