2011-07-21 13 views
0

私はVB.Net 4.0の依存プロパティをAsyncコールバック内で更新しようとしています。私はこれを正しくやっているように感じるが、私はまだ "呼び出しスレッドはこのオブジェクトにアクセスすることができません。別のスレッドがそれを所有しているからです。"エラー。誰かがVB.Net 4.0でデリゲートを使う良い方法を見ていますか?WPFで依存関係のプロパティを変更するUIスレッドにアクセス

Private WithEvents myObj as CallingObject 
Private Delegate Sub MyErrorDel(ByVal strError as string) 

Public Property ErrorMessage As String 
    Get 
     Return CStr(GetValue(ErrorMessageProperty)) 
    End Get 
    Set(ByVal value As String) 
     SetValue(ErrorMessageProperty, value) 
    End Set 
End Property 

Private Sub MySub() 
    myObj.CallFuncAsync() 
End Sub 

Private Sub DisplayError(ByVal strError as String) 
    'Set Dependancy Property value Bound to UI Textbox 
    ErrorMessage = strError 
End Sub 

Private Sub myObj_CallFuncCompleted(Byval sender as Object, ByVal e as CallFuncEventArgs) 
    'Call delegate and pass in error string as argument 
    Dim delError as MyErrorDel 
    delError = New MyErrorDel(AddressOf DisplayError) 
    delError("An error occured") 
    Me.Dispatcher.Invoke(delError, System.Windows.Threading.DispatcherPriority.Normal, Nothing) 
End Sub 

例外がスローされますDisplayErrorの内側にErrorMessageが、私はDisplayErrorを呼び出すためにディスパッチャを使用していていても、設定されますたび。

非同期コールバックからDependancy Propertiesにアクセスしようとしたときに問題が発生した場合は、フィードバックに感謝します。

ありがとうございました!

ああ、私はコードの問題についてブログでかなり新しいです。この質問をより適切に策定する方法についてのご意見もお待ちしております。

答えて

0

Me...の呼び出しで、別のスレッドが所有するオブジェクトに既にアクセスしている場合は、あらかじめディスパッチャへの参照を保存するか、Application.Current.Dispatcherを使用してください。

0

違反行を示していないので、ディスパッチャに到達するまで待つのではなく、delError( "エラーが発生しました")という行に代理人を招待していることが問題です。 CallFuncCompetedの実装を

に変更することを検討してください。
Me.Dispatcher.Invoke(AddressOf DisplayError, "An error occureed") 
関連する問題