【问题标题】:Bring data came from async operation to main thread将来自异步操作的数据带到主线程
【发布时间】:2009-12-04 13:06:05
【问题描述】:

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

问题是:如何将数据处理到我的库中,然后将事件提交给客户端?他们可以随心所欲地进行跨线程处理。

这对于 Compact Framework 也必须有效,因为客户端是移动客户端。这就是为什么使用 ISynchronizeInvoke 找到的解决方案无效的原因。

任何有助于使这个很好的帮助!提前致谢。

【问题讨论】:

    标签: compact-framework thread-safety asynchronous


    【解决方案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,然后将调用迁移到创建当前对象的线程,然后引发实际事件。

    【讨论】:

    • 删除了之前的评论,我的错...这看起来像工作..Thanx...我现在将完全应用它。
    • 你能否举例说明如果你有一个自定义对象,你将如何调用它并通过控制使其安全。因为我只能成功地让它工作,但我现在需要用一个 Action 调用并传递事件引发。
    • 这太可怕了,好像库是在后台线程上创建的,它将停止工作。然而,这正是我在我的一些库中所做的(如果我们调用 SetSystemPowerState 来挂起,如果不在主线程上,它就会挂起)所以.....这可能是最好的解决方案。 :(
    • 如果它是在后台线程上创建的,消费者将得到一个“必须使用 Invoke 调用方法”异常(无论如何使用 CF 2.0 及更高版本)。诚然,并不能保证在所有情况下都能做到这一点。
    • 库不是在后台线程中创建的,异步 TCP 操作带来和发送数据虽然在处理器多 I/O 中进行,默认情况下这当然会创建另一个线程。谢谢 ctacke 我会尽快尝试...
    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多