Библиотека параллельных задач - задача LongRunning против нескольких продолжений - PullRequest
11 голосов
/ 30 января 2012

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

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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 30 января 2012

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

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

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

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

4 голосов
/ 30 января 2012

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

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

...