Насколько важно указывать LongRunning для задачи? - PullRequest
1 голос
/ 10 февраля 2020

Как передать флаг LongRunning специально для Task.Run ()? подчеркивает, что может быть немного беспорядочно вставить флаги создания задач в новые API, особенно с использованием шаблона async.

И я нашел эту статью, утверждающую, что это не очень хорошая идея с async в любом случае, и ее не следует использовать: http://blog.i3arnon.com/2015/07/02/task-run-long-running/

Насколько я понимаю, этот флаг на практике будет заставить TPL раскрутить выделенный поток, а не нагружать пул потоков, но особенно если мое приложение не включает в себя много параллельных задач, действительно ли это важно? Могу ли я безопасно опустить флаг, если мой ожидаемый параллелизм меньше размера пула потоков по умолчанию (что бы это ни было) - это наихудшее, что случится, если в любом случае пул потоков будет лишен потоков в течение нескольких сотен миллисекунд?

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Флаг LongRunning по умолчанию опускается при вызове метода Task.Factory.StartNew без передачи аргумента TaskCreationOptions, поэтому можно смело предположить, что , опуская его, безопасно . На самом деле его безопаснее опустить, чем включать, поскольку этот флаг предназначен для оптимизации производительности, а не для повседневного использования.

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

В случае, если ThreadPool постоянно истощается из-за неправильного использования его потоков (блокируются в ожидании завершения операций ввода-вывода), вместо Украсив все ваши Task s флагом LongRunning, более простым и эффективным способом можно было бы увеличить минимальное количество потоков ThreadPool с помощью метода ThreadPool.SetMinThreads во время инициализации вашего применение. Например:

ThreadPool.SetMinThreads(workerThreads: 100, completionPortThreads: 5);

Отменить этот хак будет проще, если вы реорганизуете приложение для правильного использования асинхронности, вместо того, чтобы отменять флаг LongRunning везде в вашем коде.

1 голос
/ 10 февраля 2020

Вся идея Thread Pool заключается в том, что задача создания занимает несколько миллисекунд, потому что она просит ОС создать ее, переключить контексты и т. Д. И т. Д. ... поэтому для решения этой проблемы Framework создает некоторый пул и продолжает использовать потоки там для последующего использования ...

Вы правы, флаг LongRunning, скорее всего, вызовет создание нового потока ... это имеет смысл, когда новая задача займет больше времени и время создания потока не имеет в этом значения ,

Threadpool имеет определенные алгоритмы, если вы интенсивно берете оттуда много потоков и занимаете их, он может принять решение удвоить количество потоков, предполагая, что вы собираетесь брать больше и больше ... так что если вы мы собираемся занять потоки из Thread Pool достаточно долго, вы не получите никакой выгоды от ThreadPool, но вместо этого вы получите некоторые издержки.

Так что игнорирование этого флага ничего не сломает, но может принести некоторые издержки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...