【发布时间】:2015-08-11 04:20:52
【问题描述】:
我有一个用 VB.net 编写的 WPF 应用程序。我试图在计时器事件期间访问表单控件,但代码抛出异常。以下是我的代码:
Public WithEvents attendanceFetchTimer As System.Timers.Timer
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
attendanceFetchTimer = New System.Timers.Timer(cfgAttFetchInterval)
AddHandler attendanceFetchTimer.Elapsed, New ElapsedEventHandler(AddressOf getAllDeviceAttendance)
attendanceFetchTimer.Enabled = True
End Sub
Private Sub getAllDeviceAttendance(ByVal sender As Object, ByVal e As ElapsedEventArgs) Handles attendanceFetchTimer.Elapsed
If(checkBox1.isChecked) Then
'Do something here change the textbox value
txtStatus1.Text = "Getting Attendance Data Done!"
End If
End Sub
问题是当我调试时,checkBox1.isChecked 显示此消息:
“无法计算表达式,因为我们停在了无法进行垃圾回收的地方,可能是因为当前方法的代码可能被优化了。”
并在控制台中显示此错误消息:
“WindowsBase.dll 中出现了‘System.InvalidOperationException’类型的第一次机会异常”
当我尝试更改txtStatus1 的文本时,也会出现同样的问题。
【问题讨论】:
-
System.Timers.Timer 是一个非常有毒的类,只有在您完全了解它的作用时才使用它。而且您所做的不合法,您无法在 Elapsed 事件处理程序中访问 UI 组件。请改用 DispatcherTimer。
-
我已将您的问题作为副本关闭。请参阅我在链接问题中的回答,以了解如何在多线程场景中使用 DataBinding 正确使用 WPF。如果链接的答案不能满足您的需求,请随时发布新问题。