BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / dot-net / #2691同步于 2011/3/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
dotNET机器人发帖

求助一个非传统的卡界面问题

HectorInsanE
2011/3/15镜像同步13 回复
我们知道平时在下载或者执行大量计算的时候,假如不新开一个线程界面会“卡”。但是目前在做一个WPF程序的时候遇到一个很囧的问题,没法新开线程。主要的运算是Canvas上多个UIElement的碰撞检测,想用ProgressBar显示一下运算进度。以往可以用 private void SetStatus(double value) { progressBar.Value = value; } ThreadStart start = delegate() { // ... // This will work as its using the dispatcher Dispatcher.BeginInvoke( DispatcherPriority.Normal, new Action<double>(SetStatus), curProgress); }; new Thread(start).Start(); 但现在所有UI控件都公用一个Dispatcher,运算和显示肯定要被绑在同一个线程上,所以……我怎么开线程都是没用的。这种问题有什么解决方案吗?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
HectorInsanE机器人#1 · 2011/3/16
木有人遇到过同样的问题吗?
wangjianzhou机器人#2 · 2011/3/16
新线程在当前线程处于空闲的时候时才会开启(多核除外),你的主线程是在进行什么运算吗?
HectorInsanE机器人#3 · 2011/3/18
【 在 wangjianzhou 的大作中提到: 】 : 新线程在当前线程处于空闲的时候时才会开启(多核除外),你的主线程是在进行什么运算吗? : -- 不好意思,没说清楚,这是个WPF程序。UI线程在做多个Geometry的碰撞检测,运算量很大。真正的问题在于:程序界面的控件和正在计算的Geometry的Dispatcher是同一个,因此无法多开线程……
ahomer机器人#4 · 2011/3/18
分计算线程 和 进度线程不行? 【 在 HectorInsanE 的大作中提到: 】 : : 新线程在当前线程处于空闲的时候时才会开启(多核除外),你的主线程是在进行什么运算吗? : : -- : 不好意思,没说清楚,这是个WPF程序。UI线程在做多个Geometry的碰撞检测,运算量很大。真正的问题在于:程序界面的控件和正在计算的Geometry的Dispatcher是同一个,因此无法多开线程…… : ...................
HectorInsanE机器人#5 · 2011/3/18
【 在 ahomer 的大作中提到: 】 : 分计算线程 和 进度线程不行? : 【 在 HectorInsanE 的大作中提到: 】 : : : 新线程在当前线程处于空闲的时候时才会开启(多核除外),你的主线程是在进行什么运算吗? : ................... WINDOWS FORM和WPF都有这么一条规则,就是当某个线程要操作某个对象之前,会先确认对象是否由这个线程创建,这个过程是通过检查dispatcher实现的。而所有的控件和Geometry类都属于UIElement,UIElement的创建线程都是WPF的UI线程,所以“计算”和“更新”都只能在同一个线程里面实现。
ahomer机器人#6 · 2011/3/20
用BackgroundWorker吧 http://msdn.microsoft.com/zh-cn/magazine/cc163328.aspx ---------------------------------- 【 在 HectorInsanE 的大作中提到: 】 : : 分计算线程 和 进度线程不行? : : 【 在 HectorInsanE 的大作中提到: 】 : : : : 新线程在当前线程处于空闲的时候时才会开启(多核除外),你的主线程是在进行什么运算吗? : ...................
HectorInsanE机器人#7 · 2011/3/21
backgroundworker当时也考虑过,不过MSDN说: 您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。 http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker%28v=vs.80%29.aspx 【 在 ahomer 的大作中提到: 】 : 用BackgroundWorker吧 : http://msdn.microsoft.com/zh-cn/magazine/cc163328.aspx : ---------------------------------- : ...................
Kazuki机器人#8 · 2011/3/21
我很困惑LZ为何不用backgroudworker。。。?DoWork里面计算,然后把结果通过ProgressChanged事件传出来再更新界面不行么?
ahomer机器人#9 · 2011/3/21
在计算过程,不做操作界面对象是合理的 符合MVC原则 计算过程完全可以更新某个进度变量,然后进度条根据这个变量变化 【 在 HectorInsanE (EJ|BYR-Enjoy|GC|TIC029|鲨鱼帮极光鲨) 的大作中提到: 】 : backgroundworker当时也考虑过,不过MSDN说: : 您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。 : http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker%28v=vs.80%29.aspx : ...................