首页 文章

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

提问于
浏览
0

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

“跨线程操作无效:从创建它的线程以外的线程访问控制'滑块' . ”

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

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

5 回答

  • 0

    您想使用Dispatcher.Invoke方法 .

    如果你的 thisDependencyObject 类,你可以简单地使用它:

    this.Dispatcher.Invoke((Action)(() =>
        {
            slider.DoAnythingYouWant();
        }));
    
  • 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

  • 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中以这种方式完成了这些工作 .

  • 0

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

    Application.Current.Dispatcher.Invoke(Callback):
    
  • 0

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

    this

相关问题