我有一个用 VB.NET 编写的 Windows 服务,它使用 System.Timers.Timer 实例来执行一些周期性任务。我刚刚使用实体框架 4.3.1 从 .NET 迁移到 .NET 4.5。只要不使用实体框架,计时器的“已用”事件处理程序就会正常启动。使用实体框架时,事件处理程序不会触发。它只是,不火。没有抛出异常,没有事件日志消息,什么都没有。使用 .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 构建的实体框架 4.3.1
提前谢谢你,潘泰利斯·纳齐亚瓦斯
编辑:虽然这仍然是一个问题,但我想我找到了该怪谁。由于某些无法解释的原因,用于创建 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 是罪魁祸首。我认为这仍然应该被视为一个错误,因为我从未遇到过异常或表明我做错了什么的事情。计时器,