C#中的timer與線程使用
C#的timer與線程使用
卡頓怎么處理,多線程。多線程比timer好讀??纯磘imer和線程的關系。
timer有3種
1.winform 下的timer。就是拖控件到UI上的那個timer.
源文件在這個路徑下C:\Windows\Microsoft.NET\Framework64\v4.0.30319
namespace System.Windows.Forms
{
? ? // 摘要: ? ?實現按用戶定義的時間間隔引發(fā)事件的計時器。 此計時器最宜用于 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.IsTimerRunning;
? ? ? ? }
? ? ? ? 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); 源碼如下。
可見,最終調用的是系統(tǒng)的timer?系統(tǒng)是有定時器的。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);
? ? ? ? ? ? });
? ? ? ? }以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
C#基于Mongo的官方驅動手擼一個Super簡易版MongoDB-ORM框架
本文給大家分享C#基于Mongo的官方驅動手擼一個簡易版MongoDB-ORM框架,是一款屬于super簡易版的,通過圖文的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-05-05
C#利用OLEDB實現將DataTable寫入Excel文件中
這篇文章主要為大家詳細介紹了C#如何利用OLEDB實現將DataTable寫入Excel文件中,文中的示例代碼簡潔易懂,具有一定的借鑒價值,需要的可以參考一下2023-02-02

