开发者

C#中的timer与线程使用

开发者 https://www.devze.com 2022-12-01 13:49 出处:网络 作者: qgbooooo
目录C#的timer与线程使用timer有3种C#新线程延时开启一个新线程C#的timer与线程使用卡顿怎么处理,多线程。多线程比timer好读。看看timer和线程的关系。timer有3种1.win...
目录
  • 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")][SpythonRDescriptionAttribute("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.IsTimerRunning;
    }
    set
    {
      lock (this.syncObj)
      {
  javascript      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 &&a开发者_Python学习mp; !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;
   }
   e编程客栈lse 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 = val编程ue;
     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.Iteandroidms.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);
      });
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。 

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号