我在 vb.net 中构建了自定义Windows服务,这些服务在计时器上运行,并在远程目录中查找要处理的文件。 在少数服务器上,它们在同一时间(VSS 服务发生故障时大约晚上 10:04)失败而不会出现任何错误。 服务错误如下所示:
"进程无法访问文件文件名.txt因为它正被另一个进程使用。">
有时没有错误,但服务挂起。 我假设这是 VSS 服务。 无论如何,CPU 存在巨大的峰值,高达 100% 并回落。 我有日志(即上面无法写入的文件)将所有活动中继给我,并且每个进程都包含在 try 中。catch 这也将为我报告日志异常。 这什么也没发生。 这些进程在代码的随机部分失败,通常在轮询计时器中失败,有时在处理过程中没有警告。 服务挂起,但表示它仍在 services.msc 中运行。
有没有人遇到过这个问题或知道修复程序? 我正在考虑使服务成为多线程,以便在一个线程挂起时可以检查另一个线程,但不确定这是否可以解决问题。 我们尝试为服务器提供更多资源,这似乎有所帮助,但并未完全解决问题。 有些日子它会超载,有些则不会。 使用 Windows Server 2008 x64。
提前感谢您的帮助!
Public Shared aTimer As New Timers.Timer
Public Shared Sub SetTimer()
aTimer.Interval = 60000
' Hook up the Elapsed event for the timer.
AddHandler aTimer.Elapsed, AddressOf OnTimedEvent
aTimer.Enabled = True
End Sub
' The event handler for the Timer.Elapsed event.
Private Shared Sub OnTimedEvent(source As Object, e As ElapsedEventArgs)
Dim gen = New Service1
aTimer.Enabled = False
gen.ProcessEvents() 'This is the main function of the service
aTimer.Enabled = True
End Sub
更新:
从未想过这样的简单解决方案,但是在任务管理器中,我右键单击该服务并将优先级设置为"实时",希望备份期间的高CPU负载不会影响服务。 目前为止,一切都好。
这可以通过编程方式完成,因此每次服务重新启动时,它的优先级都更高。 这是在我的OnStart():
VB.NET:
System.Diagnostics.Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.RealTime