在AsyncCallback试图调用End Invoke调用线程不能访问这个对象,因为不同的线程拥有它

问题描述:

我使用委托开始调用调用一个方法。当它进入了AsyncCallback的方法,我试图检索使用EndInvoke会功能的结果,但我得到的错误在AsyncCallback试图调用End Invoke调用线程不能访问这个对象,因为不同的线程拥有它

,因为不同的线程拥有它

调用线程不能访问该对象我的回调方法看起来是这样的:

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”,也不是generateDelegate应该在UI线。

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

如果您不知道它可能会使用Debug + Exceptions,请勾选Thrown复选框以查看CLR异常。调试器现在停止在引发此异常的语句上。赞成任务类或异步/等待。

+0

我的目标是让UI在可能长时间运行的过程执行时保持活动状态。我已经能够得到它现在执行,但直到达到回调,UI仍然没有响应。切换到任务是可行的解决方案,如果是的话,它会解决UI问题吗? – Lance 2014-12-02 18:40:21

+0

我想我需要创建一个新的问题,或者阅读更多关于如何在WPF的长时间处理过程中创建响应式UI的问题。 – Lance 2014-12-02 19:40:22