2007-04-10
传入时间字符串,返回与系统当前时间的毫秒差值
做Windows service,要从配置文件读取定时处理时间,再取得与当前时间的差,设置处理定时器。下面的函数是为了完成取差值。传入的参数格式是:"HH:MM:SS",秒数可省:"HH:MM",各数值为00~99的数值,表示从零时后多少小时,又多少分,又多少秒,与报时用的时间有别。
Private Function GetTimeOffset(ByVal strTime As String) As Double
Dim objReg As New Regex("(\d{1,2}):(\d{1,2})(?::(\d{1,2}))?")
Dim objMatch As Match
Dim objLanuch As TimeSpan
Dim objOffsetSpan As TimeSpan
If Not objReg.IsMatch(strTime) Then
Return -1
End If
objMatch = objReg.Match(strTime)
If String.Empty.Equals(objMatch.Groups(3).Value) Then
objLanuch = New TimeSpan(Integer.Parse(objMatch.Groups(1).Value), _
Integer.Parse(objMatch.Groups(2).Value), _
0)
Else
objLanuch = New TimeSpan(Integer.Parse(objMatch.Groups(1).Value), _
Integer.Parse(objMatch.Groups(2).Value), _
Integer.Parse(objMatch.Groups(3).Value))
End If
objOffsetSpan = objLanuch.Subtract(DateTime.Now.TimeOfDay)
If objOffsetSpan.TotalMilliseconds <= 0 Then
objOffsetSpan = objOffsetSpan.Add(New TimeSpan(1, 0, 0, 0))
End If
Return objOffsetSpan.TotalMilliseconds
End Function
Dim objReg As New Regex("(\d{1,2}):(\d{1,2})(?::(\d{1,2}))?")
Dim objMatch As Match
Dim objLanuch As TimeSpan
Dim objOffsetSpan As TimeSpan
If Not objReg.IsMatch(strTime) Then
Return -1
End If
objMatch = objReg.Match(strTime)
If String.Empty.Equals(objMatch.Groups(3).Value) Then
objLanuch = New TimeSpan(Integer.Parse(objMatch.Groups(1).Value), _
Integer.Parse(objMatch.Groups(2).Value), _
0)
Else
objLanuch = New TimeSpan(Integer.Parse(objMatch.Groups(1).Value), _
Integer.Parse(objMatch.Groups(2).Value), _
Integer.Parse(objMatch.Groups(3).Value))
End If
objOffsetSpan = objLanuch.Subtract(DateTime.Now.TimeOfDay)
If objOffsetSpan.TotalMilliseconds <= 0 Then
objOffsetSpan = objOffsetSpan.Add(New TimeSpan(1, 0, 0, 0))
End If
Return objOffsetSpan.TotalMilliseconds
End Function
Labels: .Net2.0, Windows service
如何调试Windows service的onStart()方法
一般来说,启动Windows service后,创建定时器,定时调用处理过程。调试定时处理过程时,挂载到服务进程,再等待定时器被激发后,IDE会停在断点,进行单步跟踪调试。但想对onStart()进行调试却比较困难,因为等我们完成挂载时,onStart()已经执行完毕了。所以,首先要想办法让onStart()慢点执行,以便我们在服务启动并执行到断点前,有足够的时间来挂载调试器。要实现这个功能,最简单的就是让程序在断点前,暂停一段时间。我们可以追回一句:
System.Threading.Thread.Sleep(10000)
Sleep()的参数是毫秒,这里是暂停10秒,应该有足够的时间,让我们从容挂载调试器。
要注意的是,从管理控制台,点启动服务时,就马上去IDE的TOOL菜单下挂载调试器,而不是等服务启动完成。服务是在onStart()执行完毕后,才完成启动的,那时再去挂载,就为时已晚了。这点我们可以修改暂停时间来证明,如果时间设得越长,则服务器动时,那个等待进度条走得就越慢。
System.Threading.Thread.Sleep(10000)
Sleep()的参数是毫秒,这里是暂停10秒,应该有足够的时间,让我们从容挂载调试器。
要注意的是,从管理控制台,点启动服务时,就马上去IDE的TOOL菜单下挂载调试器,而不是等服务启动完成。服务是在onStart()执行完毕后,才完成启动的,那时再去挂载,就为时已晚了。这点我们可以修改暂停时间来证明,如果时间设得越长,则服务器动时,那个等待进度条走得就越慢。
Labels: .Net2.0, Windows service
Subscribe to Posts [Atom]