长时间运行的操作应该使用线程还是任务?

3

我需要在我的应用程序中有一个长时间运行的线程(它是一个作业调度器,类似于Cron),大部分时间都会处于睡眠状态。因此CPU和IO不会太多。您建议我使用什么方法来处理这个问题?使用具有长时间运行选项的任务是否是处理此问题的正确方式,还是应该依靠老式的线程并让该线程自己运行?


我敢说两者都不是最好的选择。为什么不在实际需要时将工作安排在线程池中,而不是创建一个大部分时间都处于睡眠或阻塞状态的线程呢?如果您需要任务按照排队顺序执行,可以使用OrderedTaskScheduler/LimitedConcurrencyLevelTaskScheduler。 - Kirill Shlenskiy
2
一个线程会自动消耗一百万字节的虚拟内存和页面文件空间(请记住,线程堆栈在CLR中是已提交的,而不仅仅是保留的),因此你认为计时器太重量级的想法并没有多大意义。你已经愿意使用最重量级的常用对象;几乎所有东西都比单一用途的专用线程更轻巧。 - Eric Lippert
1
或许你的意思是Quartz.NET太过笨重了;我对此一无所知。但是:使用正确的工具总是更好的选择。定时器用于在特定时间间隔后运行代码,因此我倾向于使用它而不是尝试编写自己的定时器。 - Eric Lippert
@EricLippert:任务和线程是否存在相同的资源问题? - Dave
2
@Dave:长时间运行的任务可以从线程池中分配一个线程。线程池策略的目的当然是为了降低创建和销毁像线程这样的重量级对象的成本。我的建议是:按照您认为最好的方式编写程序,并在此过程中使用对客户有意义的度量标准来衡量其性能。这样,您就会知道您的选择是否会给客户带来痛苦。 - Eric Lippert
显示剩余3条评论
1个回答

1

带有长时间运行选项的任务是可以的。它会在后台创建一个新的线程,您不必担心细节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接