首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C#中以多线程方式访问WPF GUI

在C#中以多线程方式访问WPF GUI
EN

Stack Overflow用户
提问于 2009-11-25 02:52:26
回答 2查看 2.7K关注 0票数 1

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

相关堆栈跟踪部分:

代码语言:javascript
运行
复制
   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吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-25 02:55:51

您不能从其他线程安全地访问gui。所有调用都必须通过调用来分派,以便在主线程上执行。这是一个遗留的问题,Windows已经背负了多年。

这里有一段代码,可以让你入门……(点击此处:http://social.msdn.microsoft.com/forums/en-US/wpf/thread/360540eb-d756-4434-86f9-a3449f05eb55/ )

代码语言:javascript
运行
复制
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/

票数 5
EN

Stack Overflow用户

发布于 2009-11-25 03:23:17

正如Andrew已经说过的,您应该跨线程同步对GUI的访问(这就是它的方式--您对此无能为力)。

但是,Dispatcher是一种特定于WPF的同步机制。如果您想坚持使用更通用的方法,那么可以看看System.Threading.SynchronizationContext类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1792129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档