Поток или задача для длительной работы

Мне нужен поток в моем приложении, который будет работать долго (это планировщик заданий, как Cron) и большую часть времени будет спать. Так что не так много процессора и ввода-вывода. Что вы мне посоветуете по этому поводу. Является ли задача с длительным выполнением правильным способом справиться с этим, или я должен полагаться на старомодный поток и позволить этому потоку жить своей собственной жизнью?


comment
Не лучше ли для этого использовать таймер? Возможно, Quartz.Net тоже будет хорошим вариантом.   -  person Dirk    schedule 01.06.2013
comment
@Dirk: я пробовал, но мне не очень нравится. Я думаю, что это слишком тяжело для такой работы. Кроме того, мне нужно поддерживать состояния между каждым вызовом. Вероятно, я мог бы иметь статическую переменную для хранения этого состояния, но обычно стараюсь их избегать.   -  person Dave    schedule 01.06.2013
comment
Осмелюсь сказать, что ни то, ни другое. Почему бы вам просто не запланировать свою работу в пуле потоков когда вам это действительно нужно вместо создания потока, который большую часть своей жизни будет спать или блокироваться? Вы можете использовать OrderedTaskScheduler/LimitedConcurrencyLevelTaskScheduler, если вам требуется, чтобы задачи выполнялись точно в том порядке, в котором они были поставлены в очередь.   -  person Kirill Shlenskiy    schedule 01.06.2013
comment
Поток автоматически потребляет один миллион байт как виртуальной памяти, так и пространства файла подкачки (помните, что стеки потоков фиксируются в среде CLR, а не просто зарезервированы), поэтому вы подумали, что таймер слишком тяжеловесен< /i> не имеет особого смысла. Вы уже готовы использовать самый тяжелый объект, который обычно используется; почти все легче, чем выделенный для одной цели поток.   -  person Eric Lippert    schedule 01.06.2013
comment
Или, возможно, вы имели в виду, что Quartz.NET слишком тяжеловесен; Я бы ничего об этом не знал. Но все же: всегда лучше использовать правильный инструмент для работы. Таймеры предназначены для запуска кода через определенный интервал, поэтому я был бы склонен использовать один из них, а не пытаться написать свой собственный.   -  person Eric Lippert    schedule 01.06.2013
comment
@EricLippert: я согласен. Я не думал о Таймере, когда думал о тяжелом весе, а о Quartz.Net. Под капотом я использую таймер для работы по времени. Вы правы, что заставляет меня идти по пути Task или Thread, так это то, что мне нужно хранить состояние (это распределенная аренда в Azure), поскольку я просто хочу, чтобы один Cron работал для всех моих рабочих процессов. Мне нужен этот планировщик, потому что мне нужно периодически обновлять аренду или выбирать новый планировщик, если прежний планировщик выходит из строя (чего никогда не происходит :))   -  person Dave    schedule 01.06.2013
comment
@EricLippert: Разделяет ли Задача ту же проблему с ресурсами, что и Поток?   -  person Dave    schedule 01.06.2013
comment
@Dave: длительная задача может выделить поток из пула потоков. Цель стратегии объединения, конечно же, состоит в снижении стоимости создания и уничтожения тяжеловесных объектов, таких как потоки. Мой совет: пишите программу так, как вам кажется лучше всего, и измеряйте ее эффективность, используя метрики, значимые для ваших клиентов. Таким образом, вы будете знать, причиняет ли один из ваших вариантов боль покупателю.   -  person Eric Lippert    schedule 01.06.2013


Ответы (1)


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

person user1908061    schedule 01.06.2013