通过事件和代理调度事件

时间:2016-10-27 21:04:36

标签: c# wpf dispatcher

我有第三方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));
}

1 个答案:

答案 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();
}