我使用TcpListener类处理作为套接字服务器的WPF GUI应用程序。 TcpListener配置为在收到侦听套接字的数据时进行回调。但问题是,当我尝试从回调触摸GUI时,TcpListener回调来自另一个线程并导致跟随错误:
"跨线程操作无效:控制'滑块'从其创建的线程以外的线程访问。"
任何想法如何解决这个问题?
我熟悉Qt,这可以通过信号/插槽系统完成,该系统可以将事件发送到另一个线程。 C#中是否有类似的功能?
答案 0 :(得分:0)
您应该在UI线程中调用您的代码。尝试使用Dispatcher
Application.Current.Dispatcher.Invoke(Callback):
答案 1 :(得分:0)
您需要使用WPF Dispatcher类将方法调用回UI线程 - 请参阅
答案 2 :(得分:0)
您想使用Dispatcher.Invoke方法。
如果您的this
为DependencyObject
课程,则只需使用此代码:
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中以这种方式完成了这些工作。