[C.C++] C#中的timer与线程使用

2985 7
Honkers 2022-11-10 07:55:45 | 显示全部楼层 |阅读模式
目录

    C#的timer与线程使用
      timer有3种
    C#新线程延时
      开启一个新线程



C#的timer与线程使用

卡顿怎么处理,多线程。多线程比timer好读。看看timer和线程的关系。

timer有3种

1.winform 下的timer。就是拖控件到UI上的那个timer.   
源文件在这个路径下C:\Windows\Microsoft.NET\Framework64\v4.0.30319
namespace System.Windows.Forms
{
  // 摘要:  实现按用户定义的时间间隔引发事件的计时器。 此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中   使用。
  [DefaultEvent("Tick")]
  [DefaultProperty("Interval")][SRDescriptionAttribute("DescriptionTimer")][ToolboxItemFilter("System.Windows.Forms")]
  public class Timer : Component
}启动timer代码如下:  
[SRCategory("CatBehavior")]
  [DefaultValue(false)]
  [SRDescription("TimerEnabledDescr")]
  public virtual bool Enabled
  {
    get
    {
      if (this.timerWindow == null)
      {
        return this.enabled;
      }
      return this.timerWindow.IsTimeRunning;
    }
    set
    {
      lock (this.syncObj)
      {
        if (this.enabled != value)
        {
          this.enabled = value;
          if (!base.DesignMode)
          {
            if (value)
            {
              if (this.timerWindow == null)
              {
                this.timerWindow = new TimerNativeWindow(this);
              }
              this.timerRoot = GCHandle.Alloc(this);
              this.timerWindow.StartTimer(this.interval);
            }
            else
            {
              if (this.timerWindow != null)
              {
                this.timerWindow.StopTimer();
              }
              if (this.timerRoot.IsAllocated)
              {
                this.timerRoot.Free();
              }
            }
          }
        }
      }
    }
  }最终调用了this.timerWindow.StartTimer(this.interval); 源码如下。
可见,最终调用的是系统的timer?系统是有定时器的。Ucos上,就有32个定时器,当然也可以开线程。
他们是不同的概念。windows 也差不多吧。这些定时器应该与CPU有关。
public void StartTimer(int interval)
  {
    if (this._timerID == 0 && !this._stoppingTimer && this.EnsureHandle())
    {
      this._timerID = (int)SafeNativeMethods.SetTimer(new HandleRef(this, base.Handle), TimerNativeWindow.TimerID++, interval, IntPtr.Zero);
    }
  }2.  public sealed class Timer : MarshalByRefObject, IDisposable   System.Threading.Timer
public Timer(TimerCallback callback)
{
  int dueTime = -1;
  int period = -1;
  StackCrawlMark stackCrawlMark = StackCrawlMark.LookForMyCaller;
  this.TimerSetup(callback, this, (uint)dueTime, (uint)period, ref stackCrawlMark);
}

[SecurityCritical]
private void TimerSetup(TimerCallback callback, object state, uint dueTime, uint period, ref StackCrawlMark stackMark)
{
  if (callback == null)
  {
   throw new ArgumentNullException("TimerCallback");
  }
  this.m_timer = new TimerHolder(new TimerQueueTimer(callback, state, dueTime, period, ref stackMark));
}

[SecurityCritical]
internal static void Pause()
{
  TimerQueue.Instance.Pause();
}

[SecurityCritical]
internal static void Resume()
{
  TimerQueue.Instance.Resume();
}这里是TimerQueue 队列的操作。既然在Threading 命名空间下,可能与线程有关。他在的dll 是 mscorlib.
3.  System.Timers.Timer,  在system.dll中。  只是对 System.Threading.Timer的封装。
[TimersDescription("TimerEnabled")]
[DefaultValue(false)]
public bool Enabled
{
  get
  {
   return this.enabled;
  }
  set
  {
   if (base.DesignMode)
   {
    this.delayedEnable = value;
    this.enabled = value;
   }
   else if (this.initializing)
   {
    this.delayedEnable = value;
   }
   else if (this.enabled != value)
   {
    if (!value)
    {
     if (this.timer != null)
     {
      this.cookie = null;
      this.timer.Dispose();
      this.timer = null;
     }
     this.enabled = value;
    }
    else
    {
     this.enabled = value;
     if (this.timer == null)
     {
      if (this.disposed)
      {
       throw new ObjectDisposedException(base.GetType().Name);
      }
      int num = (int)Math.Ceiling(this.interval);
      this.cookie = new object();
      this.timer = new System.Threading.Timer(this.callback, this.cookie, num, this.autoReset ? num : (-1));
     }
     else
     {
      this.UpdateTimer();
     }
    }
   }
  }
}4.使用:
void Application_Start(object sender, EventArgs e)
  {
    // 在应用程序启动时运行的代码
    if (timer != null)
    {
      timer.Stop();
      timer.Close();
      timer = null;
    }
    int Interval = 3600000;//6 hours
    timer = new System.Timers.Timer(Interval);//十分钟
    timer.Elapsed += SendSMS.Send_ticker;
    timer.Interval = Interval;
    timer.Enabled = true;
    timer.Start();
  }
C#新线程延时


开启一个新线程

在这个线程中,进行任务排队。
任务1完成后,等待延时200ms,再运行任务2
private void Timer1_Tick(object sender, EventArgs e)
    {
      //throw new NotImplementedException();
      Task.Run(() =>
      {

        this.Invoke( new Action( () =>
        {
          listBox1.Items.Add("进中断"+DateTime.Now.ToString() + "\r\n");
        }));
        //RS485.Set_io(7);//ok
        //RS485.Rest_io(7);//ok
        if (i > 8) i = 0;
        RS485.Set_io(i++);//ok
        this.Invoke(new Action(() =>
        {
          listBox1.Items.Add("第1次输出" + DateTime.Now.ToString() + "\r\n");
        }));

        Thread.Sleep(200);
        RS485.Rest_io((ushort)(i - 2));//ok                     
        this.Invoke(new Action(() =>
        {
          listBox1.Items.Add("第2次输出" + DateTime.Now.ToString() + "\r\n");
        }));

        Thread.Sleep(200);
        //RS485.Read_io_out(0,8);//ok
        RS485.Read_io_in(0, 8);//ok
        this.Invoke(new Action(() =>
        {
          listBox1.Items.Add("第3次输出" + DateTime.Now.ToString() + "\r\n");
        }));
        //RS485.Read_io_Reg(0,4);//
        //RS485.Read_io_Regs(0, 6);//
        Thread.Sleep(200);
      });
    }以上为个人经验,希望能给大家一个参考,也希望大家多多支持中国红客联盟。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

荣誉红客

关注
  • 4004
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行