I’m relatively new to VB.NET and WPF and I have a basic threading question.
I’m just trying to figure out how to use a Timer inside a Page that is using the NavigationService. Here is what I have:
Public Class SplashPage
Inherits Page
Public Sub New(ByVal oData As Object)
StartTimer(5000)
End Sub
Public Sub StartTimer(ByVal iInterval As Double)
Dim timeoutTimer As New System.Timers.Timer
timeoutTimer.Interval = 5000
timeoutTimer.Enabled = True
'Function that gets called after each interval
AddHandler timeoutTimer.Elapsed, AddressOf OnTimedEvent
End Sub
Public Sub OnTimedEvent(source As Object, e As System.Timers.ElapsedEventArgs)
If NavigationService.CanGoBack Then
NavigationService.GoBack()
End If
'MessageBox.Show(e.SignalTime)
End Sub
End Class
The NavigationService.CanGoBack statement is causing the error message: “The calling thread cannot access this object because a different thread owns it.”
Any advice or suggestions would be appreciated. Thanks!
- MG
The problem here is that you can’t touch UI elements from a background thread. In this scenario the
Timer.Elapsedevent fires in a background thread and you get an error when you touch the UI. You need to useSynchronizationContext.Postto get back to the UI thread before touching the elements