2012-03-12 9 views
1

私はVB.NETとWPFには比較的新しいので、基本的なスレッディングに関する質問があります。VB.NET WPFスレッディング

私は、NavigationServiceを使用しているページの中でタイマーを使用する方法を理解しようとしています。ここで私が持っているものです。

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 

NavigationService.CanGoBack文はエラーメッセージを引き起こしている:「別のスレッドがそれを所有しているので、呼び出し元のスレッドがこのオブジェクトにアクセスすることはできません」

ご意見やご提案をいただければ幸いです。ありがとう!

  • MG

答えて

1

ここでの問題は、あなたがバックグラウンドスレッドからUI要素に触れることができないということです。このシナリオでは、Timer.Elapsedイベントがバックグラウンドスレッドで発生し、UIに触れるとエラーが発生します。あなたは、私はあなたのコードの2行目に、このエラーを取得してい要素

Private context = SynchronizationContext.Current 
Public Sub OnTimedEvent(source As Object, e As System.Timers.ElapsedEventArgs) 
    context.Post(AddressOf OnTimerInMainThread, e) 
End Sub 

Private Sub OnTimerInMainThread(state as Object) 
    Dim e = CType(state, ElapsedEventArgs) 
    If NavigationService.CanGoBack Then 
    NavigationService.GoBack() 
    End If 

    MessageBox.Show(e.SignalTime) 
End Sub 
+0

に触れる前に戻ってUIスレッドに取得するためにSynchronizationContext.Postを使用する必要があります「オブジェクト参照がオブジェクトのインスタンスに設定されていません」 – zzMzz

+0

@MikeG ym bad。私はそれを修正するコードを変更 – JaredPar

+0

私の質問に答えを提供してくれてありがとうJared!私はまた、System.Windows.Threading.DispatcherTimerが、上記のタイマーを使用して実行した面倒なことなしに、必要なことをしたことも発見しました。 – zzMzz