Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中对WPF GUI的多线程访问_C#_Wpf_Multithreading - Fatal编程技术网

C# 在C中对WPF GUI的多线程访问

C# 在C中对WPF GUI的多线程访问,c#,wpf,multithreading,C#,Wpf,Multithreading,我正在尝试创建一个自定义的内部应用程序,该应用程序将访问通过UDP广播其名称和IP地址的其他内部系统。我正在尝试创建一个多线程对话框,该对话框每500毫秒轮询一次UDP消息,持续15秒,解析UDP消息,然后将检测到的系统名称添加到对话框中的列表框中,并实时更新它。我已经测试并完成了UDP扫描代码,唯一的问题是跨线程更新列表框。每当我尝试访问ListBox的Items或ItemSource属性时,我都会得到一个System.InvalidOperationException:调用线程无法访问此对象

我正在尝试创建一个自定义的内部应用程序,该应用程序将访问通过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]);
}