先说说本人的需求吧,目的就是想在同一个进程中独立开个工作线程定时独立进行工作计算(类似于后台),定时将结果更新给前台UI,工作线程要求定时准确,不受UI操作影响,(工作线程的工作量可能很大),请教以下几个问题:
1、对于定时器有三种,分别是System.Timers.Timer、System.Threading.Timer和System.Windows.Forms.Timer,请教哪种比较合适?主要是前两者之间
2、对于System.Threading.Timer,是不是其实每次都是定时创建一个线程,然后执行完毕后又将线程结束等待时间到了再重新创建一个线程?那这种定时准确么?是主进程的定时器在定时创建?
3、对于工作线程定时独立计算,如果工作线程的执行时间大于了定时的间隔,在已经加锁防止共享出错的情况下会产生什么情况?是后一个线程在等待前一个线程做完再继续?还是后一个线程就停止了?
如果造成这种情况,会不会导致线程越开越多的情况?比如间隔1分钟,执行时间为3分钟,结果10分钟过去共产生10个线程但只完成了前3个线程,第4个线程正在执行?遇到这种情况是不是就不适合定时开线程?应该如何处理?
4、工作线程如何更新客户端UI?是直接客户端UI开定时器调用还是工作线程进行消息响应触发客户端调用比较好?

解决方案 »

  1.   

    、对于定时器有三种,分别是System.Timers.Timer、System.Threading.Timer和System.Windows.Forms.Timer,请教哪种比较合适?主要是前两者之间
    http://msdn.microsoft.com/en-us/magazine/cc164015.aspx
    如果你没有兴趣看,简单来说System.Timers.Timer更好
    2、对于System.Threading.Timer,是不是其实每次都是定时创建一个线程,然后执行完毕后又将线程结束等待时间到了再重新创建一个线程?那这种定时准确么?是主进程的定时器在定时创建?
    不是等待线程结束,而是到时候就创建
    3、对于工作线程定时独立计算,如果工作线程的执行时间大于了定时的间隔,在已经加锁防止共享出错的情况下会产生什么情况?是后一个线程在等待前一个线程做完再继续?还是后一个线程就停止了?
    如果造成这种情况,会不会导致线程越开越多的情况?比如间隔1分钟,执行时间为3分钟,结果10分钟过去共产生10个线程但只完成了前3个线程,第4个线程正在执行?遇到这种情况是不是就不适合定时开线程?应该如何处理?
    会的,你可以用ThreadPool或者队列,而Timer只用来添加任务,而不把任务代码直接写在Timer里面。
    4、工作线程如何更新客户端UI?是直接客户端UI开定时器调用还是工作线程进行消息响应触发客户端调用比较好?
    最好使用委托,反向调用而不是轮训。