none
Remoting中的异步回调 RRS feed

  • 常规讨论

  • 请教大家一个问题:在进行remoting分布式系统开发时,使用了异步回调的处理机制。

    现遇到的问题是:通过异步回调方式产生的值,怎样才能显示在winform的窗体中。异步回调是通过接口来实现的。在实现接口的方法中,已接收到服务器端传回的值,但不知道有什么办法使其显示在winform中。系统提示:线程间操作无效: 从不是创建控件“dataGridView1”的线程访问它。

    2010年11月21日 6:31

全部回复

  • 我猜想您是想问,采用了异步方法得到返回值以后,无法将其正确的显示在 Windows Form 上吧?

    根据您的错误提示我可以判断这是因为您在异步方法中直接访问了 Windows Form 控件 dataGridView,由于异步方法在默认情况下利用线程池 (ThreadPool) 中的一个活动线程运行,此时如果在此方法中操作 UI 控件,则会造成跨进程访问对象的异常 (因为 UI 元素创建于 UI 线程,其他对象均无法访问它)。因此,必须要使用 this.Invoke 方法来进行基于 SynchronizationContext 的同步。例如:

    public void OnReceivedData(IAsyncResult result)
    {
        // 结束异步方法并获得返回值。
        object returnValue = someObject.EndSomeMethid(result);

        // 显示。
        this.Invoke(() => { this.dataGridView.DataSource = returnValue; });
    }


    Mark Zhou
    2010年11月22日 8:05