我有第三方DLL,我通过网络套接字从设备接收数据。 Foo_WorkCompleted
是在收到数据并自动触发时订阅操作的事件。我的第一个尝试是检查是否已访问该线程,如果没有,则从新线程再次调用自身以更新UI。但是我收到了被占用的线程异常。然后我尝试从调度程序中调用一个委托,这是有效的。
我看不出两者之间的区别。事件应该像委托一样工作。那么,为什么一个有效但另一个无效。有人请帮忙解释一下吗?
这不起作用(线程异常):
private void Foo_WorkCompleted(object sender, WorkCompletedEventArgs e)
{
if (Dispatcher.CheckAccess())
{
Dispatcher.BeginInvoke(
(EventHandler<WorkCompletedEventArgs>)Foo_WorkCompleted, sender, e);
return;
}
SomeMethod();
}
这有效:
private delegate void UpdateUIDelegate();
private void Foo_WorkCompleted(object sender, WorkCompletedEventArgs e)
{
Dispatcher.BeginInvoke(
DispatcherPriority.Send, new UpdateUIDelegate(SomeMethod));
}
答案 0 :(得分:1)
您正在使用CheckAccess,如果调用线程是调度程序的主线程,它将返回true,因此如果返回false,则需要执行调用:
private void Foo_WorkCompleted(object sender, WorkCompletedEventArgs e)
{
if (!Dispatcher.CheckAccess())
{
Dispatcher.BeginInvoke(
(EventHandler<WorkCompletedEventArgs>)Foo_WorkCompleted, sender, e);
return;
}
SomeMethod();
}