Доступ к потоку пользовательского интерфейса для изменения свойств зависимости в WPF - PullRequest
0 голосов
/ 21 июля 2011

Я пытаюсь обновить свойство зависимости в VB.Net 4.0 внутри обратного вызова Async.Мне кажется, что я делаю это правильно, но я все еще получаю «Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им».ошибка.Кто-нибудь видит лучший способ использования делегатов в VB.Net 4.0?

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

Всякий раз, когда ErrorMessage устанавливается внутри DisplayError, генерируется исключение, даже если я использую диспетчер для вызова DisplayError.

Если кто-нибудь увидит какие-либо проблемы с тем, как я пытаюсь получить доступ к Dependancy Properties из асинхронного обратного вызова, я был бы очень признателен за обратную связь.

Спасибо за помощь!

Да, и я 'Я довольно новичок в блогах о проблемах с кодом.Любые предложения о том, как лучше сформулировать этот вопрос, также приветствуются.

Ответы [ 2 ]

0 голосов
/ 22 июля 2011

Поскольку вы не указали строку, вызывающую сбой, я подозреваю, что проблема здесь в том, что вы вызываете свой делегат в строке delError («Произошла ошибка»), а не ждете, пока не доберетесь до диспетчера.Попробуйте изменить реализацию CallFuncCompeted на

Me.Dispatcher.Invoke(AddressOf DisplayError, "An error occureed")
0 голосов
/ 21 июля 2011

Проблема может заключаться в том, что при вызове Me... вы уже обращаетесь к объекту, принадлежащему другому потоку, пытаетесь заранее сохранить ссылку на диспетчер или, возможно, используете Application.Current.Dispatcher.

...