高分探讨wpf定时器/线程问题

michaelmou 2011-07-07 03:27:08
我有这样一个关于WPF定时器的问题,百思不得其解:
有个UI线程的任务,有起始时间,结束时间,当任务开始执行后,我用DispatcherTimer检查是否到结束时间,如果到了,就停止任务。
这样似乎没什么问题,界面响应也挺快,可是当我有N个任务,流程如下:
For i=1 to n
任务(i).start()
定时器检查
Thread.sleep(任务(i)持续时间) //如果没有这句,就会只执行第n个任务
next
当执行这个操作时,界面几乎没有反应,无法进行其他操作。
因为是UI线程的任务,所以似乎无法使用其他线程来执行。
请问有没有好的解决办法。

非常感谢!
...全文
253 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
michaelmou 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 duanzilin 的回复:]
你是想在前一个任务停止后再执行后面任务?如果是这样的话这么做就可以了啊:

比如定时器检查间隔是1分钟,让DispatcherTimer的间隔为1分钟,设置一个类范围的计数器N,当DispatcherTimer开始计时,第一次Tick时执行任务1,同时计数器+1,第二次Tick时关停止一个任务,开始第二个任务,依次类推
[/Quote]

参考duanzilin的思路,我增加了一个定时器,用来管理任务的顺序执行,在任务的定时器里设置完成标志,当新增的定时器检测到任务已经完成就开始执行下一个任务,问题解决,界面没有出现阻塞。
多谢duanzilin!
kakaniuren 2011-07-07
  • 打赏
  • 举报
回复
因为多个线程在同时对UI进行操作的时候,线程本身就会被堵塞,因为UI的操作一个线程执行结束,令一个线程才会开始执行。不知道楼主在执行程序的时候,看看机器的内存占用率。如果Thread.sleep(任务(i)持续时间)里的i值很低的话,基本会造成假死的现象,UI也没法更新。只有当最后一次才会有更新。

建议楼主把UI线程操作放到 DispatcherTimer里进行操作,同时保证i的值>1000.
沝林 2011-07-07
  • 打赏
  • 举报
回复
你是想在前一个任务停止后再执行后面任务?如果是这样的话这么做就可以了啊:

比如定时器检查间隔是1分钟,让DispatcherTimer的间隔为1分钟,设置一个类范围的计数器N,当DispatcherTimer开始计时,第一次Tick时执行任务1,同时计数器+1,第二次Tick时关停止一个任务,开始第二个任务,依次类推
michaelmou 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 duanzilin 的回复:]
Thread.sleep()阻塞的是UI线程,所以界面会没反应,加了这句话说明任务i+1要开始必须等sleep完了后才能继续
[/Quote]

是的,您说的没错,可是如果没有这句,n之前的任务都不会执行,有没有好的办法?
沝林 2011-07-07
  • 打赏
  • 举报
回复
Thread.sleep()阻塞的是UI线程,所以界面会没反应,加了这句话说明任务i+1要开始必须等sleep完了后才能继续

8,737

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧