在AsyncCallback中尝试调用End Invoke调用线程无法访问此对象,因为另一个线程拥有它

时间:2014-12-02 14:00:29

标签: .net wpf vb.net multithreading delegates

我正在使用委托开始调用来调用方法。当它进入AsyncCallback方法时,我试图使用EndInvoke检索函数的结果但是收到错误

  

调用线程无法访问此对象,因为另一个线程拥有它

我的回电方法如下:

Private Sub GenerateCallback(ByVal result As IAsyncResult)
    Dim html As String = generateDelegate.EndInvoke(result) -- Error occurs here
    Dispatcher.Invoke(Function(value As String) CurrentWebResults.DocumentText = value, html)
End Sub

我尝试使用Dispatch.Invoke,它没有解决问题但似乎没有意义,因为变量" html"也不应该在UI线程上生成generateDelegate。

1 个答案:

答案 0 :(得分:2)

EndInvoke()将重新抛出在委托的目标方法上引发的任何异常。当您使用委托的BeginInvoke()方法时,肯定会在工作线程上运行。显然,该方法正在访问一个线程不安全的对象,这种对象需要Dispatcher.Invoke()。

如果您不知道它可能是哪个,请使用Debug + Exceptions,勾选CLR异常的Thrown复选框。调试器现在将停止在引发此异常的语句处。喜欢Task类或async / await。