Что означает "долгосрочные задачи"?

По умолчанию CLR запускает задачи по объединенным потокам, что идеально подходит для короткая работа с вычислением. Для более длительной работы и блокировки операций, вы можете предотвратить использование объединенного потока следующим образом:

Task task = Task.Factory.StartNew (() => ...,
TaskCreationOptions.LongRunning);

Я читаю тему о thread и task. Можете ли вы объяснить мне, что такое "длительные [er] -разовые" и "короткие" задачи?

Ответ 1

В общем объединении потоков вы выделяете краткосрочные и длинные потоки на основе сравнения времени их запуска и времени выполнения.

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

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

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

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

И наоборот, короткие потоки - это те, чье время работы меньше или сопоставимо с временем запуска.


Для .NET, это немного отличается в работе. Код объединения потоков, как только он достигнет минимального количества потоков, попытается ограничить создание потоков на одну секунду в секунду.

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

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

Ответ 2

"TaskCreationOptions.LongRunning указывает, что задача будет длительной, крупнозернистой операцией, включающей в себя меньшие, более крупные компоненты, чем мелкозернистые системы. Она дает подсказку TaskScheduler, что может потребоваться переподписка. больше потоков, чем доступное количество аппаратных потоков". - MSDN http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskcreationoptions(v=vs.110).aspx