C#中的timer與線程使用
C#的timer與線程使用
卡頓怎么處理,多線程。多線程比timer好讀??纯磘imer和線程的關(guān)系。
timer有3種
1.winform 下的timer。就是拖控件到UI上的那個(gè)timer.
源文件在這個(gè)路徑下C:\Windows\Microsoft.NET\Framework64\v4.0.30319
namespace System.Windows.Forms { ? ? // 摘要: ? ?實(shí)現(xiàn)按用戶定義的時(shí)間間隔引發(fā)事件的計(jì)時(shí)器。 此計(jì)時(shí)器最宜用于 Windows 窗體應(yīng)用程序中,并且必須在窗口中 ? ? 使用。 ? ? [DefaultEvent("Tick")] ? ? [DefaultProperty("Interval")][SRDescriptionAttribute("DescriptionTimer")][ToolboxItemFilter("System.Windows.Forms")] ? ? public class Timer : Component }
啟動(dòng)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(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? }
最終調(diào)用了this.timerWindow.StartTimer(this.interval); 源碼如下。
可見,最終調(diào)用的是系統(tǒng)的timer?系統(tǒng)是有定時(shí)器的。Ucos上,就有32個(gè)定時(shí)器,當(dāng)然也可以開線程。
他們是不同的概念。windows 也差不多吧。這些定時(shí)器應(yīng)該與CPU有關(guān)。
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 隊(duì)列的操作。既然在Threading 命名空間下,可能與線程有關(guān)。他在的dll 是 mscorlib.
3. System.Timers.Timer, 在system.dll中。 只是對(duì) 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) ? ? { ? ? ? ? // 在應(yīng)用程序啟動(dòng)時(shí)運(yùn)行的代碼 ? ? ? ? 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#新線程延時(shí)
開啟一個(gè)新線程
在這個(gè)線程中,進(jìn)行任務(wù)排隊(duì)。
任務(wù)1完成后,等待延時(shí)200ms,再運(yùn)行任務(wù)2
?private void Timer1_Tick(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? //throw new NotImplementedException(); ? ? ? ? ? ? Task.Run(() => ? ? ? ? ? ? { ? ? ? ? ? ?? ? ? ? ? ? ? ? ? this.Invoke( new Action( () =>? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? listBox1.Items.Add("進(jìn)中斷"+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); ? ? ? ? ? ? }); ? ? ? ? }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)數(shù)組元素的數(shù)據(jù)類型轉(zhuǎn)換方法詳解
這篇文章主要為大家介紹了C#中一維數(shù)組如何快速實(shí)現(xiàn)數(shù)組元素的數(shù)據(jù)類型的轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-04-04利用WPF實(shí)現(xiàn)Windows屏保的制作
屏保程序的本質(zhì)上就是一個(gè)Win32?窗口應(yīng)用程序。本文將利用WPF實(shí)現(xiàn)Windows屏保的制作,文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們學(xué)習(xí)WPF有一定幫助,感興趣的可以了解一下2022-07-07C#字符串與數(shù)值類型、字節(jié)數(shù)組的互相轉(zhuǎn)換實(shí)戰(zhàn)案例
最近由于編程的需要,對(duì)C#的類型轉(zhuǎn)換做了一些研究,下面這篇文章主要給大家介紹了關(guān)于C#字符串與數(shù)值類型、字節(jié)數(shù)組的互相轉(zhuǎn)換的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06C#線程 BeginInvoke和EndInvoke使用方法
本文開始C#線程系列講座之一,即BeginInvoke和EndInvoke的使用方法,需要的朋友可以參考下2013-05-05