当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C#中对WPFGUI的多线程访问》经验,为你挑选了1个好方法。

我正在尝试创建一个自定义的内部应用程序,该应用程序将访问通过UDP广播其名称和IP地址的其他内部系统.我正在尝试创建一个多线程对话框,每500毫秒轮询一次UDP消息15秒,解析UDP消息,然后将检测到的系统的名称添加到对话框中的ListBox,实时更新.我已经测试并完成了UDP扫描代码,唯一的问题是跨线程更新ListBox.每当我尝试访问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(我知道,与集合类型无关),HashSet或任何其他对象,都会发生这种情况.任何人都可以帮助我跨不同的线程访问GUI吗?



1> Andrew Rolli..:

您无法从其他线程安全地访问gui.所有调用都必须通过调用Invoke来调度,以便在主线程上执行.这是Windows多年来一直背负的遗留问题.

这里有一段代码可以帮助你入门......(见这里:http://social.msdn.microsoft.com/forums/en-US/wpf/thread/360540eb-d756-4434-86f9-a3449f05eb55/)

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]);
}

此处还有其他说明:http://channel9.msdn.com/forums/TechOff/251835-WPF-Invoke-and-Anonymous-delegates/

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有