事件调度员本身和通过委托

Dispatcher on an event by itself and through delegate

我有一个第 3 方 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));
}

您正在反向使用 CheckAccess,如果调用线程是调度程序的主线程,它将 return 为真,因此如果它 return 为假,您需要执行调用:

private void Foo_WorkCompleted(object sender, WorkCompletedEventArgs e)
{
    if (!Dispatcher.CheckAccess())
    {
        Dispatcher.BeginInvoke(
        (EventHandler<WorkCompletedEventArgs>)Foo_WorkCompleted, sender, e);
        return;
    }

    SomeMethod();
}