或许这个标题给人一种误解,Timer与委托相关,其实不是的,只是想总结一下关于.Net下的异步处理技术,委托是必不可少的一部分,也是最核心的一部分。
关于异步处理,就必须想到线程技术,线程的实现有很多种方式,这里主要总结通过System.Timer.Timer类来实现的线程技术,其他的大概介绍一下,嘎嘎。
多线程的实现方式主要有以下几个
1.BackGroundWorkerk控件,通过使用RunWorkerAsync()方法和一系列的事件处理机制来实现后台线程的控制,实际上BackGroundWorkerk控件隐式地调用了委托,在后台封装了这个技术。
2.调用BeginXXX方法,其实这个方法就是显示地调用delegate,不用多说。
3.手动调用ThreadPool.QueueUserWorkItem方法,将方法直接手动放如线程池,但是这个方法要求必须传入一个Object类型的参数,并在任务结束时不会自动回调一个方法,必须自己在工作方法中手动设置回调。
4.System.Timer.Timer
摘取MSDN上面的介绍,已经很清楚了
Timer 组件是基于服务器的计时器,它使您能够指定在应用程序中引发 Elapsed 事件的周期性间隔。然后可以操控此事件以提供定期处理。例如,假设您有一台关键性服务器,必须每周 7 天、每天 24 小时都保持运行。可以创建一个使用 Timer 的服务,以定期检查服务器并确保系统开启并在运行。如果系统不响应,则该服务可以尝试重新启动服务器或通知管理员。
基于服务器的 Timer 是为在多线程环境中用于辅助线程而设计的。服务器计时器可以在线程间移动来处理引发的 Elapsed 事件,这样就可以比 Windows 计时器更精确地按时引发事件。有关基于服务器的计时器的更多信息,请参见“基于服务器的计时器介绍”。
基于 Interval 属性的值,Timer 组件引发 Elapsed 事件。可以处理该事件以执行所需的处理。例如,假设您有一个联机销售应用程序,它不断向数据库发送销售订单。编译发货指令的服务分批处理订单,而不是分别处理每个订单。可以使用 Timer 每 30 分钟启动一次批处理。
Elapsed 事件在 ThreadPool 线程上引发。如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。
如果和用户界面元素(如窗体或控件)一起使用 Timer,请将包含有 Timer 的窗体或控件赋值给 SynchronizingObject 属性,以便将此事件封送到用户界面线程中。
其中的Elapsed事件所调用的方法,被看做是运行在后台的线程上的。
Imports System Imports System.Timers Public Class Timer1 Public Shared Sub Main() Dim aTimer As New System.Timers.Timer() ' 为Elapsed事件添加处理方法OnTimedEvent. AddHandler aTimer.Elapsed, AddressOf OnTimedEvent ' Set the Interval to 2 seconds (2000 milliseconds). aTimer.Interval = 2000 aTimer.Enabled = True Console.WriteLine("Press the Enter key to exit the program.") Console.ReadLine() ' Keep the timer alive until the end of Main. GC.KeepAlive(aTimer) End Sub ' Specify what you want to happen when the Elapsed event is ' raised. Private Shared Sub OnTimedEvent(source As Object, e As ElapsedEventArgs) Console.WriteLine("Hello World!") End Sub End Class