Server Timers, Windows Timers, and Thread Timers的对比

本文介绍了三种定时器。Windows Timers为单线程设计,需UI激活,在单线程执行;Server timers为多线程设计,架构不同,可跨线程;Thread Timers在无消息时更有效。还介绍了它们的命名空间、Server Timer关键元素及属性方法,并给出示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Server Timers提供了一种定时执行常规操作的机制,例如:有个关键的服务需要7*24Hours/Week,那就可以创建使用Timer的检查程序,定时的检查该关键服务启动,如果没有启动,检查程序就重新启动该关键服务,并通知系统管理员
注意:Server Timers的间隔最小单位是豪秒

Server Timers, Windows Timers, and Thread Timers
在DotNet Framework中有三中Timers,Server-based Timer在Toolbox的Components Tab 中,标准的Windows-base Timer在Toolbox的Windows Forms Tab中,而Thread Timer只能在程序中使用(无UI界面),Windows-base Timers从VB1.0开始就存在了,并且本质没有改变,Windows-base Timer 通常在WinForm中使用,Servers-base Times是传统的Timers的升级、优化,更适用与Server环境,Thread Timers是一简单的、轻量级的Timer,只是用回掉方法调用方法代替Event,为Threadpool的threads服务。

Threads在Win32的程序中有两种架构:Ui Threads,Worker Threads, UI Threads是在等待新Message 到Message loops,一旦有新Message,他们就Handle新Message,并且等待下一个Message,相反的,Worker Threads执行一个后台的操作,不需要Message loops.

Windows Times 和 Server Timer 都用了 Interval 属性,该属性在Timer的Constructor中设定,Timers为不同的设计目的设置该属性。


  • Windows Timers是为single-threaded 设计的,需要用户写UI界面去激活它,并且自始自终在一个Thread中,或者Marshal 一个Call 到另一个Thread,对与com组件来说,这样的执行是有害的
  • Server timers 是为multi-threaded 设计的,应为它用了不同的构架,有更多的使用时间,Server可以夸Thread
  • Thread Timers 在没有Message是很有效,例如Window Timer 依靠OS的支持,如果没有Message在Thread中,Timers中的事件就不会触发,而此时,Thread Timer就很有用了

Windows Timers 在System.Windows.Forms 的名字空间中, Server timer在 System.Timers 的名字空间中, Thread timer 在System.Threading 的名字空间中

Server Timer 的关键元素

Timer 会产生Timer.Elapsed,你可以接管它,执行想要的操作

其他的重要的属性和方法

  • Interval是扫描的时间间隔(以毫秒为单位),触发Event事件.例如:Interval 为1000时候,就是每隔一秒中执行一次
  • AutoReset 检测在Event触发以后,Timer是否继续,True,继续,False就是停止
  • Start方法将Timers 的Enabled 属性设为True(允许Timers开始)如果Timer已经Start,那么就是重置Timer
  • Stop 方法将Timers 的Enabled 属性设为True(Timers停止)

Sample Code:
private void CreateTimer()
{
   System.Timers.Timer Timer1 = new System.Timers.Timer();
   Timer1.Enabled = true;
   Timer1.Interval = 5000;
   Timer1.Elapsed +=
      new System.Timers.ElapsedEventHandler(Timer1_Elapsed);
}

private void Timer1_Elapsed(object sender,
System.Timers.ElapsedEventArgs e)
{
   System.Windows.Forms.MessageBox.Show("Elapsed!",
      "Timer Event Raised!");
}









 

定时器无法从另一个线程停止。是的,这句话的意思是如果你在一个线程中启动了一个定时器,那么你不能从另一个线程中停止它。如果你尝试这样做,会抛出一个异常。这是因为定时器是与线程相关联的,如果你试图从另一个线程中停止它,就会导致定时器与其关联的线程状态不一致,从而引发异常。因此,你应该确保在启动定时器的线程中停止它。没错,你的理解是正确的。当你在一个线程中启动了一个定时器,该定时器会与该线程相关联,因此只能在该线程中停止它。如果你尝试从另一个线程中停止该定时器,就会导致线程状态不一致,从而引发异常。因此,为了避免这种情况发生,你应该确保在启动定时器的线程中停止它。 是的,你的理解是正确的。在多线程编程中,定时器是与其所属的线程相关联的。如果你尝试从另一个线程中停止该定时器,就会导致线程状态不一致,从而引发异常。因此,为了避免这种情况发生,你应该确保在启动定时器的线程中停止它。在停止定时器之前,你应该确保定时器已经完成了它的操作,以免在停止之前丢失数据或状态。是的,你的理解是正确的。在多线程编程中,定时器是与其所属的线程相关联的。如果你尝试从另一个线程中停止该定时器,就会导致线程状态不一致,从而引发异常。因此,为了避免这种情况发生,你应该确保在启动定时器的线程中停止它。在停止定时器之前,你应该确保定时器已经完成了它的操作,以免在停止之前丢失数据或状态。 另外,如果你需要在另一个线程中停止定时器,可以考虑使用线程间通信的方式,让启动定时器的线程收到停止信号后自行停止定时器。常见的线程间通信方式包括锁、条件变量、信号量等,具体选择哪种方式要根据具体情况而定。 是的,你的补充非常正确。如果需要在另一个线程中停止定时器,可以通过线程间通信的方式来实现。其中一种常见的方式是使用信号量或事件来进行线程间通信,启动定时器的线程会等待信号或事件的触发,一旦接收到停止信号或事件,就会停止定时器的运行。 另外,如果定时器需要执行的操作涉及到共享数据,还需要确保线程安全。这通常可以通过使用锁或其他同步机制来实现,以避免不同线程之间对共享资源的访问冲突。在进行多线程编程时,需要特别注意线程安全问题,以确保程序的正确性和可靠性。计时器不能从另一个线程停止。计时器无法从另一个线程停止。定时器无法从另一个线程停止。计时器不能从另一个线程停止。 不能从另一个线程中停止计时器。计时器无法从另一个线程停止。计时器无法从另一个线程停止。定时器无法从另一个线程停止。定时器无法从另一个线程停止。计时器无法从另一个线程停止。计时器无法从另一个线程停止。 在另一个线程中无法停止计时器。计时器无法从另一个线程停止。 这是因为计时器是在创建它的线程上运行的,而且只能被创建它的线程停止。如果您想要从另一个线程停止计时器,您需要在创建计时器时使用某种同步机制来实现线程间通信。例如,您可以使用信号量或互斥锁来控制计时器的启动和停止。计时器无法从另一个线程停止。这是因为计时器在特定线程上运行,只有该线程才能停止计时器。如果您想要从另一个线程停止计时器,您需要将停止请求发送给运行计时器的线程,并由该线程执行停止操作。定时器无法从另一个线程停止。这是因为定时器是在创建它们的线程上运行的,并且只能在该线程上停止。如果您想要从另一个线程停止定时器,可以使用线程间通信机制来向创建定时器的线程发送信号或消息,以请求其停止定时器。计时器无法从另一个线程停止。 这是因为计时器是与创建它的线程相关联的,只能由该线程访问和控制。如果您尝试从另一个线程停止计时器,将无法访问计时器对象,因此无法停止计时器。 如果您需要在另一个线程中停止计时器,请考虑使用线程间通信机制,例如信号量或队列,使创建计时器的线程能够响应来自另一个线程的停止请求。在大多数编程语言中,计时器通常是与线程相关的。如果您在一个线程中启动了一个计时器,那么在另一个线程中停止计时器可能会出现问题,因为不同的线程可以并行运行。由于这种并行运行的性质,有可能在您停止计时器之前,另一个线程可能已经在计时器上触发了事件。因此,通常情况下,只有在启动计时器的同一线程中才能够安全地停止计时器。定时器无法从另一个线程停止。计时器不能从另一个线程停止。 在多线程编程中,如果一个线程创建了一个计时器并开始计时,另一个线程不能直接停止该计时器。这是因为在不同的线程中访问计时器会引起竞争条件,可能导致计时器无法正确停止或停止时机不确定。如果需要停止计时器,可以在计时器所在的线程中调用停止函数或者发送一个停止信号,由计时器所在的线程接收信号后自行停止计时器。计时器不能从另一个线程停止。 这是因为在一个线程中启动的计时器只能在该线程中停止,不能在其他线程中停止。如果需要在另一个线程中停止计时器,可以使用线程间通信来实现。可以通过发送信号或使用共享变量等方式,在另一个线程中触发停止计时器的操作。定时器不能从另一个线程停止。 如果您在一个线程中启动了一个定时器,那么只能从该线程中停止它。如果您试图从另一个线程中停止它,您将遇到困难或者出现问题。因此,在编写多线程应用程序时,请确保在正确的线程中启动和停止定时器。在大多数编程语言中,计时器是以线程的形式实现的。如果您想停止一个计时器,您需要在创建它的线程中停止它。不能从另一个线程直接停止计时器,因为这会导致线程不安全的问题。如果您需要从另一个线程停止计时器,您需要使用线程间通信机制(例如信号量、互斥锁等)来协调这些线程之间的操作。计时器不能从另一个线程停止。这是因为计时器是在一个特定的线程上创建和启动的,只有在创建它的线程上才能停止它。如果想要在另一个线程中停止计时器,可以向创建它的线程发送信号或请求来停止计时器。 不可以,Timer 只能从当前线程中停止。计时器不能从另一个线程停止。这是因为计时器通常是在其自己的线程中运行,而在其他线程中调用停止方法可能会导致竞态条件或死锁等问题。因此,应该在启动计时器的线程中调用停止方法。定时器不能从另一个线程停止。 如果你在一个线程中启动了定时器,那么只能在该线程中停止它。如果你尝试在另一个线程中停止定时器,那么可能会导致未定义的行为,例如定时器无法停止或程序崩溃。因此,在多线程环境中使用定时器时,必须小心处理定时器的停止操作,以确保只有启动定时器的线程才能停止它。计时器不能从另一个线程停止。这是因为在一个线程中创建的计时器只能被该线程访问和控制,其他线程无法直接访问或修改该计时器的状态。如果需要停止计时器,应该在创建计时器的线程中进行停止操作。如果需要在其他线程中停止计时器,可以考虑使用线程间通信机制,例如信号量或消息队列。计时器无法从另一个线程停止。这是因为计时器的停止方法必须在创建它的线程上调用,否则会引发异常或无法正常停止计时器。如果需要在另一个线程中停止计时器,可以考虑使用线程间通信机制来传递停止信号,让创建计时器的线程响应信号并停止计时器。计时器无法从另一个线程停止。 在多线程编程中,如果一个线程创建了计时器并启动了它,那么只有该线程才能停止计时器。如果另一个线程想要停止该计时器,那么它必须通过与创建该计时器的线程进行通信,以便请求停止计时器。这可以通过使用线程间通信机制(如事件、信号量等)来实现。计时器不能从另一个线程停止。 这是因为计时器本质上是一个线程,它在后台执行,并在预定的时间间隔内触发事件。如果您尝试从另一个线程停止计时器,那么您将面临竞态条件的风险,因为您无法确保计时器线程在执行停止操作时不会同时执行触发事件的代码。因此,正确的做法是在创建计时器的线程中停止它,或使用线程安全的方法来进行通信,以便安全地从另一个线程停止计时器。这个问题的意思是无法从另一个线程停止计时器。 计时器通常用于在一段时间后执行某些任务。但是,如果您在一个线程中启动计时器,而尝试从另一个线程中停止计时器,则会出现问题。这是因为计时器的停止必须在启动计时器的同一线程中执行。 要解决这个问题,可以使用线程间通信技术,如信号量或管道,在不同的线程之间进行通信,并通知启动计时器的线程停止计时器。或者,您可以使用可以从另一个线程中停止的计时器,例如Java中的ScheduledExecutorService。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值