Я хотел бы знать, что использовать для задач, требующих высокой производительности. Backgroundworker
, Thread
или ThreadPool
?
До сих пор я работал с Threads, но мне нужно улучшить скорость моих приложений.
Я хотел бы знать, что использовать для задач, требующих высокой производительности. Backgroundworker
, Thread
или ThreadPool
?
До сих пор я работал с Threads, но мне нужно улучшить скорость моих приложений.
BackgroundWorker - это то же самое, что и поток пула потоков. Он добавляет возможность запускать события в потоке пользовательского интерфейса. Очень полезно для отображения прогресса и для обновления пользовательского интерфейса с результатами. Таким образом, его типичное использование - предотвратить зависание пользовательского интерфейса, когда необходимо выполнить работу. Производительность - не первая цель, в отличие от асинхронного выполнения кода. Этот шаблон также умело расширен в более поздних версиях .NET классом Task ‹> и ключевыми словами async / await.
Потоки пула потоков полезны, чтобы избежать потребления ресурсов. Поток - это дорогостоящий объект операционной системы, и вы можете создать очень ограниченное их количество. Поток занимает 5 дескрипторов операционной системы и мегабайт адресного пространства виртуальной памяти. Нет метода Dispose () для раннего освобождения этих дескрипторов. Пул потоков существует в первую очередь для повторного использования потоков и для обеспечения того, чтобы не слишком много из них было активным. Важно, чтобы вы использовали поток пула потоков только тогда, когда выполняемая им работа ограничена, в идеале - не более полсекунды. И не часто блокирует. Поэтому он лучше всего подходит для коротких периодов работы, а не для всего, что имеет значение. Обработка завершения ввода-вывода - идеальная задача для потока TP.
Да, можно также использовать потоки для повышения производительности программы. Это можно сделать с помощью Thread или Task ‹>, использующего TaskContinuationOptions.LongRunning. Есть несколько жестких требований для улучшения производительности, они довольно жесткие:
Thread
или Task
). Это потому, что он медленнее по сравнению с потоком / задачей, или это связано с памятью, или потому, что он тормозит систему, или это какая-то другая проблема? Предположим, у вас неприятно параллельная проблема с примерно 4-20 ядрами / потоками (с соответствующими физическими ядрами), и решение проблемы может занять несколько минут.
- person Dan W; 09.05.2016
Структура для запуска задач, интенсивно использующих ЦП, в потоках не имеет отношения к вашей проблеме, если только у вас нет слишком мелких подзадач.
Вам нужно разделить вашу работу на подзадачи, которые могут выполняться параллельно, если у вас для этого более одного процессора.
Этот выбор не имеет особого значения. BackgroundWorker - это поток ThreadPool, так что в любом случае никакой разницы. Однако вы можете попытаться оптимизировать количество потоков с помощью ThreadPool.SetMaxThreads.
И вы можете использовать класс System.Threading.Task, который может помочь оптимизировать параллельное выполнение.