【发布时间】:2014-12-10 06:31:40
【问题描述】:
我认为我对线程的处理非常好,直到我遇到了一个我想对不同网格的更新进行基准测试的场景。
我创建了一个带有网格控件的窗口,将ObservableCollection 绑定到它,并用5000 行某些复杂数据类型(不包含锁)填充它。
然后我使用
创建了一个任务 Task.Factory.StartNew()
这经历了一个非常紧凑的循环(1000 万次迭代),更新了我的 ObservableCollection 中随机项目的随机属性,当然每个都会引发 INotifyPropertyChanged 事件。
现在,由于更新都发生在后台线程上,我希望 UI 能够更新,尽管很难跟上这个在紧密循环中旋转的后台线程。
相反,UI 冻结了几秒钟(但没有变成空白或产生通常的厄运旋转光标),然后在后台线程完成后返回。
我的理解是,后台线程会在产生大量 INPC 的同时对内核造成相当大的负担,每个 INPC 都会由 WPF 运行时自动编组到 UI 线程。
现在 UI 线程什么也不做,所以我希望它消耗所有这些 INPC 并更新网格,但它没有;没有发生一次更新。但是,当我使用计时器(而不是紧密循环)执行此操作时,它可以正常工作。
有人能告诉我 UI 线程到底在做什么吗?提前致谢!
【问题讨论】:
-
你能提供最短的代码示例来说明这个问题吗?
-
“紧密循环”是指每次迭代都没有延迟吗?这似乎是一个简单的 UI 被无法跟上的更新轰炸的案例。
标签: c# wpf multithreading