通过Quartz调度作业的性能比运行while(true)线程更好

时间:2016-10-22 20:49:57

标签: c# .net multithreading quartz-scheduler

目前我的应用程序有15个(相互独立)线程,具有以下结构

while(true)
{
    //do repeating work
    Thread.Sleep(x time);
}

最近我学到了一点Quartz,我想知道用while循环删除这些线程并组织“//做重复工作”作为Quartz作业,最后以递归方式调度下一次调用此作业会更好吗?

2 个答案:

答案 0 :(得分:1)

如果你正在使用while(true)和Thread.Sleep你会有很多线程,很多时候会被阻塞(休眠),如果现在不需要某个线程,那就更好了对于特定的操作,可以自由地做另一个吗?

你应该仔细使用你的线程,它们是你app的昂贵资源!

虽然我不确定Quartz内部是如何工作的,但我确信它不会无缘无故地阻塞很多线程,这样可以节省你自己管理所有线程的需求。方式。

您可以将Quartz的使用情况与计时器的使用情况进行比较(计算器也不会无理由地阻止线程,还有should be prefered over using while(true) and Thread.Sleep),还有一些缺少计时器的优点:

  
      
  • 计时器没有持久性机制。
  •   
  • 计时器不灵活   调度(只能设置开始时间和重复间隔,没有   基于日期,时间等。
  •   
  • 计时器不使用线程池   (每个计时器一个线程)
  •   
  • 定时器没有真正的管理方案 - 你是   必须编写自己的机制,以便能够记住,组织   并按姓名等方式撤回你的任务。
  •   

取自Quartz.NET - Frequently Asked Questions

答案 1 :(得分:1)

答案取决于您的应用程序的架构和重复工作的性质"。使用线程有很多优点:您可以独立调度工作而无需管理任务队列的额外开销,您可以为不同的线程分配不同的优先级,将它们标记为背景或前景等。简而言之 - 您可以灵活地换取一些效率损失,这通常可以忽略15个线程。

我可以建议:使用ManualResetEvent.WaitOne而不是Thread.Sleep - 它允许您在应用程序停止或重新启动时立即正确地关闭所有线程并立即关闭。