Задача Параллельная библиотека - задача LongRunning vs Несколько континуумов

Я изучаю использование параллельной библиотеки задач для рабочего проекта, который я делаю, и хочу понять преимущества/недостатки длительных задач. У меня пока нет примера для реальной жизни, просто хочу понять теорию этого.

Из того, что страницы MSDN говорят о планировщики задач и этот вопрос SO, казалось бы, лучше избегать длительных задач, насколько это возможно, чтобы вы не создавали потоки вне ThreadPool. Но скажите, что у вас была задача, которая собиралась занять много времени, вместо этого:

Task.Factory.StartNew(() => DoTimeConsumingWork(), TaskCreationOptions.LongRunning)

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

Task.Factory
    .StartNew(() => DoWorkPart1())
    .ContinueWith(t => DoWorkPart2())
    .ContinueWith(t => DoWorkPart3())
    //...etc

Будет ли этот подход более полезен или он будет излишним для того, чего он пытается достичь?

Ответ 1

казалось бы, лучше избегать длительных задач

Не совсем правильно. Если вам это нужно, вам придется как-то сделать/распределить поток, а затем вариант Task with LongRunning, вероятно, лучший выбор. Флаг просто сообщает планировщику, что задача может занять некоторое время, чтобы планировщик мог ожидать. Это может даже игнорировать вариант.

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

Если это возможно, сделайте это. Но не все так легко отделяются.

Ответ 2

Когда вы указываете TaskCreationOptions.LongRunning, в основном он назначает выделенный поток из-за пула потоков.

Я бы предложил просто перейти к классу BackgroundWorker, который гарантирует, что ваша задача будет работать в отдельном выделенном потоке вместо потока из пула потоков