将数据从异步操作传递到主线程

时间:2009-12-04 13:06:05

标签: compact-framework thread-safety asynchronous

这是我从一个库中收到的数据的“问题”,该库在发送和接收数据时有一些异步操作。当我在移动Windows窗体或桌面上接收数据并获取数据时,我需要处理跨线程操作。我在检查InvokeRequired时处理这个问题,如果是真的则执行Action ...等...但是,我真正想要的是让它消失并正确获取我的数据所以我可以绑定它们操作等,而不处理这个跨线程问题。

问题是:如何将数据操作到我的库中,然后将事件提升到客户端?他们可以随心所欲,无需交叉线程处理。

这必须对Compact Framework有效,因为客户端是Mobile Clients。这就是使用ISynchronizeInvoke找到的解决方案无效的原因。

任何帮助,使这个很好赞赏!提前谢谢。

1 个答案:

答案 0 :(得分:1)

您可以在库的构造函数中创建一个COntrol,然后使用它调用并在调用之后引发事件。然后,使用者将在创建库类的线程的上下文中获取事件。如果你把它作为一个组件,它很可能会在UI线程上创建,因此你的事件将在UI线程中引发。

编辑1

举个例子:

private Control m_invoker = new Control();
public event EventHandler MyEvent;

private void RaiseMyEvent(object o, EventArgs args)
{
    EventHandler handler = MyEvent;
    if (handler == null) return;

    if (m_invoker.InvokeRequired)
    {
        m_invoker.BeginInvoke(new EventHandler(RaiseMyEvent), 
                              new object[] { o, args });
        return;
    }

    handler(o, args);
}

因此,您的代码将调用RaiseMyEvent,后者又将调用迁移到创建当前对象的线程,然后引发实际事件。