TaskFactory.StartNew против ThreadPool.QueueUserWorkItem - PullRequest
25 голосов
/ 15 июня 2010

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 15 июня 2010

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

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

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

6 голосов
/ 22 июня 2010

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

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

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

-Rick

2 голосов
/ 15 июня 2010

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

...