none
多线程的问题 RRS feed

  • 问题

  • 这回要写一个多线程的程序,
    原意是通过建立一个新线程来隔一段时间调用一个函数
    代码如下:

    TimerCallback timerDelegate = new TimerCallback(MessageLoop);//要调用的线程
    Timer timer = new Timer(timerDelegate, null, TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(0));
    可是为什么似乎在一段较长的时间后这个线程似乎没有执行过?(有时刚开始调试时会执行一次)
    究竟是哪里出了问题?

    2009年4月13日 12:45

答案

  • 你好!
         你使用的Timer的构造函数的原型是这样的:
    public
     Timer(
    TimerCallback callback,
    Object state,
    TimeSpan dueTime,
    TimeSpan period
    )
    如果 period 为零 (0) 或 -1 毫秒,而且 dueTime 为正,则只会调用一次 callback ;计时器的定期行为将被禁用,但通过使用 Change 方法可以重新启用该行为。
    周雪峰
    2009年4月14日 0:53
    版主
  • 这回要写一个多线程的程序,
    原意是通过建立一个新线程来隔一段时间调用一个函数
    代码如下:

    TimerCallback timerDelegate = new TimerCallback(MessageLoop);//要调用的线程
    
    Timer timer = new Timer(timerDelegate, null, TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(0));
    
    
    可是为什么似乎在一段较长的时间后这个线程似乎没有执行过?(有时刚开始调试时会执行一次)
    究竟是哪里出了问题?


    最后一个参数是调用周期, 请不要设为0, 除非你只想让它执行一次
    I'm a device.
    2009年4月14日 5:01
    版主
  • 后面两个参数 
    如果是     50, 0   就是 50ms后执行一次   
    你可以在执行内容的尾部  用 timerobj.change(50,0)预定下一次执行

    相当于 set timeout方式

    如果是     0, 50   就是 每50ms执行一次   
    不需要要重复设置

    要是50,50 就是50 ms 后 每50ms一次


    很方便
    工作突然有点忙 嘿嘿
    2009年4月14日 6:15
    版主

全部回复

  • 你好!
         你使用的Timer的构造函数的原型是这样的:
    public
     Timer(
    TimerCallback callback,
    Object state,
    TimeSpan dueTime,
    TimeSpan period
    )
    如果 period 为零 (0) 或 -1 毫秒,而且 dueTime 为正,则只会调用一次 callback ;计时器的定期行为将被禁用,但通过使用 Change 方法可以重新启用该行为。
    周雪峰
    2009年4月14日 0:53
    版主
  • 这回要写一个多线程的程序,
    原意是通过建立一个新线程来隔一段时间调用一个函数
    代码如下:

    TimerCallback timerDelegate = new TimerCallback(MessageLoop);//要调用的线程
    
    Timer timer = new Timer(timerDelegate, null, TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(0));
    
    
    可是为什么似乎在一段较长的时间后这个线程似乎没有执行过?(有时刚开始调试时会执行一次)
    究竟是哪里出了问题?


    最后一个参数是调用周期, 请不要设为0, 除非你只想让它执行一次
    I'm a device.
    2009年4月14日 5:01
    版主
  • 后面两个参数 
    如果是     50, 0   就是 50ms后执行一次   
    你可以在执行内容的尾部  用 timerobj.change(50,0)预定下一次执行

    相当于 set timeout方式

    如果是     0, 50   就是 每50ms执行一次   
    不需要要重复设置

    要是50,50 就是50 ms 后 每50ms一次


    很方便
    工作突然有点忙 嘿嘿
    2009年4月14日 6:15
    版主
  • 谢谢各位的帮忙~~~
    最近有些事情所以没有及时结帖Sorry~~
    看来是我对最后一个参数理解错误了
    我还以为是说那样是无限触发事件~~

    后来改用了System.Timer.Timer
    如果可能的话能不能解释下两者的区别啊?
    2009年4月19日 13:28