我有一个使用System.Timers.Timer实例在VB.NET中编写的Windows服务来执行一些定期任务。我刚刚使用实体框架4.3.1从.NET迁移到.NET 4.5。只要不使用实体框架,计时器的“elapsed”事件处理程序就会正常启动。使用实体框架时,事件处理程序不会触发。它只是,不会开火。没有抛出异常,没有事件日志消息,没有。使用.NET 4版本时没有发生这种情况。有人有任何建议吗?
Dim testTimer As New System.Timers.Timer
Protected Overrides Sub OnStart(ByVal args() As String)
Try
testTimer.Interval = 2 * 1000 * 60
AddHandler testTimer.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf TestTimerMethod)
testTimer.Enabled = True
Catch ex As Exception
'A method logging the respective exception
LogException(ex)
End Try
End Sub
Protected Sub TestTimerMethod()
Try
testTimer.Enabled = False
UtilitiesProvider.GetUtilitiesProvider.LogWriter.Write("Start of method")
'If I remove the next line, the event handler is fired as it should be...
Dim dbContext As New DASTADbContext
'mock some time consuming tasks
Dim i = 0
Catch ex As Exception
'Log the exception
UtilitiesProvider.GetUtilitiesProvider.LogException(ex)
Finally
testTimer.Enabled = True
End Try
End Sub
请注意以下事项: 1.我在x86模式下构建整个解决方案。我不知道这是否相关。 2.我使用VS2012构建 3.我使用日志消息以及调试附加到相应进程的整个服务来确认上述方案 4.我正在引用为运行时版.NET 4构建的Entity Framework 4.3.1
提前谢谢你, Pantelis Natsiavas
编辑:虽然这仍然是个问题,但我想我找到了谁应该受到责备。由于某些无法解释的原因,用于创建Windows服务安装项目的Installshield Limited Edition无法按预期工作。当我使用Windows服务的主要输出来创建安装项目时,由于一些无法解释的原因,Installshield LE添加了对使用Entity Framework 4的较旧且现在未使用的DLL的引用。我认为由于引用Entify Framework 4而发生了错误实体框架4.3同时。我已经同时切换到VS2012,.NET 4.5和InstallShield LE。因此,我错误地认为.NET 4.5应该受到指责。我认为这应该仍然被认为是一个错误,因为我从来没有得到异常或者某些东西表明我做错了什么。计时器,只是没有触发相应的事件处理程序(!)。