sac*_*rni 4 c# multithreading windows-services timer
我在Windows服务中使用System.threading.timer.但是计时器没有成功执行.下面是代码.
protected override void OnStart(string[] args)
{
try
{
eventLog1.WriteEntry("In OnStart");
TimeSpan dueMinutes = TimeSpan.FromMinutes(1);
TimeSpan fromMinutes = TimeSpan.FromMinutes(1);
System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(CallBack), null, dueMinutes, fromMinutes);
/*
System.Timers.Timer timer = new System.Timers.Timer(5 * 60 * 1000);
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
DBSyncHandler sync = new DBSyncHandler();
sync.startSync();
*/
}
catch (Exception ex)
{
if (!System.Diagnostics.EventLog.SourceExists("MySource"))
{
System.Diagnostics.EventLog.CreateEventSource("MySource", "MyEventLog");
}
eventLog1.Source = "MySource";
eventLog1.Log = "MyEventLog";
eventLog1.WriteEntry("Error : " + ex.Message);
}
}
public static void CallBack(object sender)
{
try
{
DBSyncHandler sync = new DBSyncHandler();
sync.startSync();
}
catch (Exception ex)
{
EventLog eventLog1 = new EventLog();
if (!System.Diagnostics.EventLog.SourceExists("MySource"))
{
System.Diagnostics.EventLog.CreateEventSource("MySource", "MyEventLog");
}
eventLog1.Source = "MySource";
eventLog1.Log = "MyEventLog";
eventLog1.WriteEntry("Error : " + ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
安装成功后.我的工作站重新启动.重启机器后,服务成功调用.但是一旦第一次调用该服务,它就不会重复下一次持续时间,即不再调用该服务.
Dav*_*ras 13
阅读MSDN上的说明:http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx
只要您使用Timer,就必须保留对它的引用.与任何托管对象一样,当没有对它的引用时,Timer会进行垃圾回收.Timer仍处于活动状态这一事实并不能阻止它被收集.
System.Threading.Timer是一个简单,轻量级的计时器,它使用回调方法并由线程池线程提供服务.不建议将其与Windows窗体一起使用,因为它的回调不会发生在用户界面线程上.System.Windows.Forms.Timer是与Windows窗体一起使用的更好选择.对于基于服务器的计时器功能,您可以考虑使用System.Timers.Timer,它会引发事件并具有其他功能.
我认为在OnStart中创建的计时器对象是gc收集或处理的.它不应该是该方法中的局部变量,因为它超出了范围.
| 归档时间: |
|
| 查看次数: |
7424 次 |
| 最近记录: |