【问题标题】:Windows Service and Timers - Separate Processes?Windows 服务和计时器 - 单独的进程?
【发布时间】:2010-08-15 06:24:23
【问题描述】:

多定时器与多线程有什么区别?

我有一个在后台运行的 Windows 服务。在初始化时加载的数据库中大约有十个“站点”。每个站点都在其自己的 Timer 对象中进行初始化,然后 Timer 在每个站点的时间间隔内执行代码。执行的代码来自主服务类中的静态方法。

当两个定时器同时执行时会发生什么?它们是否在同一进程中执行?第二个计时器是否必须等待第一个计时器退出该方法才能进入它?是否需要担心任何锁定或竞争条件?

感谢您的洞察力。

【问题讨论】:

    标签: multithreading timer


    【解决方案1】:

    我假设这是一个 .NET 问题。

    计时器使用应用程序线程池中的共享线程。

    多个计时器回调将同时执行,除非线程池中的线程已用完。

    将此与使用专用线程进行比较。专用线程将始终可用于执行代码,但它们会占用资源,因为它们不像池中的线程那样共享。

    【讨论】:

      【解决方案2】:

      首先,我认为您需要意识到线程和进程之间存在差异,快速谷歌想出了这个

      http://www.dotnetuncle.com/Difference/146_thread_process.aspx

      然后在堆栈溢出中是这个问题

      Do .NET Timers Run Asynchronously?

      所以,

      它们自己线程上的定时器不必等待其他定时器退出才能运行,因为这就像任何多线程一样,您需要考虑锁定多个定时器使用的任何资源,并且有可能竞争条件。

      【讨论】:

      • 是的,我的意思是线程不是进程......所以关于“在他们自己的线程上的定时器......”的部分成为问题的核心......当你创建新的定时器,.NET 会自动在自己的线程中运行它们吗?根据 binarycoder,默认情况下它们确实在共享线程池中运行,您不必显式地线程化它们。但我认为这意味着您必须锁定任何您不想同时访问的代码,即使没有创建显式线程。
      • 完全正确 - 大多数 .Net 计时器自动在线程池中的它们自己的线程上运行,一旦在其自己的线程上运行某些东西 - 显式或隐式 - 在锁定等方面需要同样小心。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多