在不同的线程之间进行C#回调

时间:2014-03-31 13:55:22

标签: c# multithreading

我使用TcpListener类处理作为套接字服务器的WPF GUI应用程序。 TcpListener配置为在收到侦听套接字的数据时进行回调。但问题是,当我尝试从回调触摸GUI时,TcpListener回调来自另一个线程并导致跟随错误:

"跨线程操作无效:控制'滑块'从其创建的线程以外的线程访问。"

任何想法如何解决这个问题?

我熟悉Qt,这可以通过信号/插槽系统完成,该系统可以将事件发送到另一个线程。 C#中是否有类似的功能?

5 个答案:

答案 0 :(得分:0)

您应该在UI线程中调用您的代码。尝试使用Dispatcher

Application.Current.Dispatcher.Invoke(Callback):

答案 1 :(得分:0)

您需要使用WPF Dispatcher类将方法调用回UI线程 - 请参阅

this

答案 2 :(得分:0)

您想使用Dispatcher.Invoke方法。

如果您的thisDependencyObject课程,则只需使用此代码:

this.Dispatcher.Invoke((Action)(() =>
    {
        slider.DoAnythingYouWant();
    }));

答案 3 :(得分:0)

您无法直接从单独的GUI元素访问(例如,从线程池中拉出异步操作或直接使用Thread类创建)。您需要做的是通过调度员执行您的操作,如下所示:

Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => slider.Text = "mystuff"));

有关Dispatcher如何管理线程的更多信息,请参阅下面的MSDN链接:

http://msdn.microsoft.com/en-us/library/vstudio/system.windows.threading.dispatcher

答案 4 :(得分:0)

找到完全在UI线程中创建回调函数的解决方案(CommandHandler是MainForm中的方法,并从AsynchronousSocketListener的另一个线程调用):

    void CommandHandler()
    {
        if (InvokeRequired)
        {
            /* If called from a different thread, we must use the Invoke method to marshal the call to the proper thread. */
            BeginInvoke(new AsynchronousSocketListener.ReadHandler(CommandHandler));
            return;
        }
        else
        {
            //do UI thread code here
        }
    }

对于那些可能需要工作的例子,在Basler Pylon 4.0库示例程序PylonLiveView中以这种方式完成了这些工作。