C# 在C中对WPF GUI的多线程访问
我正在尝试创建一个自定义的内部应用程序,该应用程序将访问通过UDP广播其名称和IP地址的其他内部系统。我正在尝试创建一个多线程对话框,该对话框每500毫秒轮询一次UDP消息,持续15秒,解析UDP消息,然后将检测到的系统名称添加到对话框中的列表框中,并实时更新它。我已经测试并完成了UDP扫描代码,唯一的问题是跨线程更新列表框。每当我尝试访问ListBox的Items或ItemSource属性时,我都会得到一个System.InvalidOperationException:调用线程无法访问此对象,因为其他线程拥有它 相关堆栈跟踪部分:C# 在C中对WPF GUI的多线程访问,c#,wpf,multithreading,C#,Wpf,Multithreading,我正在尝试创建一个自定义的内部应用程序,该应用程序将访问通过UDP广播其名称和IP地址的其他内部系统。我正在尝试创建一个多线程对话框,该对话框每500毫秒轮询一次UDP消息,持续15秒,解析UDP消息,然后将检测到的系统名称添加到对话框中的列表框中,并实时更新它。我已经测试并完成了UDP扫描代码,唯一的问题是跨线程更新列表框。每当我尝试访问ListBox的Items或ItemSource属性时,我都会得到一个System.InvalidOperationException:调用线程无法访问此对象
at System.Windows.Threading.Dispatcher.VerifyAccess()
at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
at System.Windows.Controls.ItemsControl.set_ItemsSource(IEnumerable value)
无论我使用的是ObservableCollection(我知道它与集合类型、哈希集或任何其他对象无关),都会发生这种情况。有人能帮我跨不同线程访问GUI吗?您不能从其他线程安全地访问GUI。所有调用都必须通过在主线程上执行的调用来调度。这是Windows多年来一直面临的遗留问题 下面是一段代码,应该可以让您开始。。。 可在此处找到:
这里还有额外的说明:您不能从其他线程安全地访问gui。所有调用都必须通过在主线程上执行的调用来调度。这是Windows多年来一直面临的遗留问题 下面是一段代码,应该可以让您开始。。。 可在此处找到:
这里还有额外的说明:正如Andrew已经说过的,您应该跨线程同步对GUI的访问—这就是它的方式—对此您无能为力
然而,Dispatcher是一种特定于WPF的同步机制。如果您想坚持使用更通用的方法,那么请查看System.Threading.SynchronizationContext类。正如Andrew已经说过的,您应该跨线程同步对GUI的访问—这就是它的方式—对此您无能为力
然而,Dispatcher是一种特定于WPF的同步机制。如果您想坚持使用更通用的方法,那么请查看System.Threading.SynchronizationContext类。哇,这是一个非常有用的答案,它成功了。非常感谢你。如果可以的话,我会再投票给你十几次。还要注意,你也可以使用Dispatcher.BeginInvoke/EndInvoke patternWow异步调度回UI线程,这是一个非常有用的答案,它做到了。非常感谢你。如果可以的话,我会再投票给你十几次。另外请注意,你也可以使用Dispatcher.BeginInvoke/EndInvoke模式异步调度回UI线程
if(textbox.Dispatcher.CheckAccess())
{
// The calling thread owns the dispatcher, and hence the UI element
textbox.AppendText(...);
}
else
{
// Invokation required
textbox.Dispatcher.Invoke(DispatcherPriority.Normal, [delegate goes here]);
}