国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

.NET Framework中定時(shí)器timer的單線程與多線程使用講解

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:37:46
文檔

.NET Framework中定時(shí)器timer的單線程與多線程使用講解

.NET Framework中定時(shí)器timer的單線程與多線程使用講解:如果你需要使用規(guī)律的時(shí)間間隔重復(fù)執(zhí)行一些方法,最簡(jiǎn)單的方式是使用定時(shí)器(timer)。與下邊的例子相比,定時(shí)器可以便捷、高效地使用內(nèi)存和資源: new Thread (delegate() { while (enabled) { DoSomeAction(); Thread.Sleep (T
推薦度:
導(dǎo)讀.NET Framework中定時(shí)器timer的單線程與多線程使用講解:如果你需要使用規(guī)律的時(shí)間間隔重復(fù)執(zhí)行一些方法,最簡(jiǎn)單的方式是使用定時(shí)器(timer)。與下邊的例子相比,定時(shí)器可以便捷、高效地使用內(nèi)存和資源: new Thread (delegate() { while (enabled) { DoSomeAction(); Thread.Sleep (T

如果你需要使用規(guī)律的時(shí)間間隔重復(fù)執(zhí)行一些方法,最簡(jiǎn)單的方式是使用定時(shí)器(timer)。與下邊的例子相比,定時(shí)器可以便捷、高效地使用內(nèi)存和資源:

new Thread (delegate() {
 while (enabled)
 {
 DoSomeAction();
 Thread.Sleep (TimeSpan.FromHours (24));
 }
 }).Start();

這不僅僅會(huì)永久占用一個(gè)線程,而且如果沒(méi)有額外的代碼,DoSomeAction每天都會(huì)發(fā)生在更晚的時(shí)間。定時(shí)器解決了這些問(wèn)題。

.NET Framework 提供了 4 種定時(shí)器。下邊兩個(gè)類是通用的多線程定時(shí)器:

(1)System.Threading.Timer
(2)System.Timers.Timer
另外兩個(gè)是專用的單線程定時(shí)器:

(3)System.Windows.Forms.Timer (Windows Forms 的定時(shí)器)
(4)System.Windows.Threading.DispatcherTimer (WPF 的定時(shí)器)
多線程定時(shí)器更加強(qiáng)大、精確并且更加靈活,而單線程定時(shí)器對(duì)于一些簡(jiǎn)單的更新 Windows Forms 和 WPF 控件的任務(wù)來(lái)說(shuō)是安全的,并且更加便捷。

1.多線程定時(shí)器Permalink

System.Threading.Timer是最簡(jiǎn)單的多線程定時(shí)器:它僅僅有一個(gè)構(gòu)造方法和兩個(gè)普通方法(取悅于極簡(jiǎn)主義者,還有本書(shū)作者!)。在接下來(lái)的例子中,一個(gè)定時(shí)器在 5 秒鐘之后調(diào)用Tick方法來(lái)打印 “ tick… “,之后每秒打印一次直到用戶按下回車鍵:

using System;
using System.Threading;

class Program
{
 static void Main()
 {
 // 首次間隔 5000ms,之后間隔 1000ms
 Timer tmr = new Timer (Tick, "tick...", 5000, 1000);
 Console.ReadLine();
 tmr.Dispose(); // 停止定時(shí)器并執(zhí)行清理工作
 }

 static void Tick (object data)
 {
 // 這里運(yùn)行在一個(gè)線程池線程上
 Console.WriteLine (data); // 打印 "tick..."
 }
}

之后可以通過(guò)調(diào)用Change方法來(lái)改變定時(shí)器的時(shí)間間隔。如果你希望定時(shí)器只觸發(fā)一次,可以指定Timeout.Infinite作為構(gòu)造方法的最后一個(gè)參數(shù)。

.NET Framework 在System.Timers命名空間下提供了另一個(gè)名字相同的定時(shí)器類。它只是封裝了 System.Threading.Timer,并在使用完全相同的底層引擎的前提下提供額外的便利。下面是增加功能的簡(jiǎn)介:

(1)實(shí)現(xiàn)了Component,允許用于 Visual Studio 的設(shè)計(jì)器中。
(2)Interval屬性代替了Change方法。
(3)Elapsed事件代替了回調(diào)委托。
(4)Enabled屬性用于開(kāi)始或停止定時(shí)器(默認(rèn)值是false)。
(5)Start和Stop方法,避免對(duì)Enabled屬性感到困惑。
(6)AutoReset標(biāo)識(shí)來(lái)指定是否為可重復(fù)的事件(默認(rèn)為true)。
SynchronizingObject屬性提供Invoke和BeginInvoke方法,用于在 WPF 和 Windows Forms 控件上安全調(diào)用方法。
這有個(gè)例子:

using System;
using System.Timers; // 命名空間是 Timers 而不是 Threading

class SystemTimer
{
 static void Main()
 {
 Timer tmr = new Timer(); // 無(wú)需任何參數(shù)
 tmr.Interval = 500;
 tmr.Elapsed += tmr_Elapsed; // 使用事件代替委托
 tmr.Start(); // 開(kāi)啟定時(shí)器
 Console.ReadLine();
 tmr.Stop(); // 停止定時(shí)器
 Console.ReadLine();
 tmr.Start(); // 重啟定時(shí)器
 Console.ReadLine();
 tmr.Dispose(); // 永久停止定時(shí)器
 }

 static void tmr_Elapsed (object sender, EventArgs e)
 {
 Console.WriteLine ("Tick");
 }
}

多線程定時(shí)器使用線程池來(lái)允許少量線程服務(wù)多個(gè)定時(shí)器。這意味著,回調(diào)方法或Elapsed事件每次可能會(huì)在不同的線程上觸發(fā)。此外,不論之前的Elapsed是否完成執(zhí)行,Elapsed總是幾乎按時(shí)觸發(fā)。因此,回調(diào)方法或事件處理器必須是線程安全的。

多線程定時(shí)器的精度依賴于操作系統(tǒng),通常是在 10-20 ms 的區(qū)間。如果需要更高的精度,你可以使用本地互操作(native interop)來(lái)調(diào)用 Windows 多媒體定時(shí)器,可以讓精度提升到 1 ms。它定義在 winmm.dll 中,首先調(diào)用timeBeginPeriod來(lái)通知操作系統(tǒng)你需要更高的定時(shí)器精度,然后調(diào)用timeSetEvent來(lái)啟動(dòng)多媒體定時(shí)器。當(dāng)使用完成后,調(diào)用timeKillEvent停止定時(shí)器,最后調(diào)用timeEndPeriod通知操作系統(tǒng)你不在需要更高的定時(shí)器精度了。可以通過(guò)搜索關(guān)鍵字 dllimport winmm.dll timesetevent 在網(wǎng)上找到完整的例子。

2.單線程定時(shí)器Permalink

.NET Framework 提供了兩個(gè)定時(shí)器,為消除WPF 和 Windows Forms 應(yīng)用程序的線程安全問(wèn)題而設(shè)計(jì):

System.Windows.Threading.DispatcherTimer(WPF)
System.Windows.Forms.Timer(Windows Forms)
單線程定時(shí)器不是被設(shè)計(jì)成能在其特定的環(huán)境外工作的。例如,如果在 Windows 系統(tǒng)服務(wù)應(yīng)用程序中使用 Windows Forms 定時(shí)器,Timer事件不會(huì)觸發(fā)!

它們暴露的成員都像System.Timers.Timer一樣(Interval、Tick、Start和Stop),并且用法也類似。但是不同之處在于其內(nèi)部是如何工作的。它們不是使用線程池來(lái)產(chǎn)生定時(shí)器事件,WPF 和 Windows Forms 定時(shí)器依賴于 UI 模型的底層消息循環(huán)機(jī)制(message pumping mechanism)。意味著Tick事件總是在創(chuàng)建該定時(shí)器的那個(gè)線程觸發(fā),在通常的程序中,它也就是管理所有 UI 元素和控件的那個(gè)線程。這有很多好處:

單線程計(jì)時(shí)器比較安全,對(duì)于更新 Windows Forms controls或者WPF這種簡(jiǎn)單任務(wù)來(lái)說(shuō)更方便。在WPF或Windows Forms中安全的調(diào)用方法的SynchronizingObject對(duì)象。
單線程計(jì)時(shí)器是被設(shè)計(jì)成屬于他們執(zhí)行環(huán)境的計(jì)時(shí)器,如果你在一個(gè)Windows服務(wù)應(yīng)用程序中使用Windows Forms的Timer,timer 事件并不會(huì)被觸發(fā),只有在對(duì)應(yīng)的環(huán)境下才會(huì)被觸發(fā)。
像System.Timers.Timer一樣,他們也提供了相同的成員(Interval,Tick,Start,Stop),但是他們內(nèi)部的工作原理不同,WPF和Windows Forms的計(jì)時(shí)器使用消息循環(huán)機(jī)制來(lái)取代線程池產(chǎn)生消息的機(jī)制。

你可以不必考慮線程安全。
新的Tick在之前的Tick完成執(zhí)行前不會(huì)觸發(fā)。
你可以直接在Tick時(shí)間事件的處理代碼中更新 UI 控件,而不需要調(diào)用Control.Invoke或Dispatcher.Invoke。
這聽(tīng)起來(lái)好的難以置信,直到你意識(shí)到使用這些定時(shí)器的程序并不是真正的多線程,不會(huì)有并行執(zhí)行。一個(gè)線程服務(wù)于所有定時(shí)器,并且還處理 UI 事件。這帶來(lái)了單線程定時(shí)器的缺點(diǎn):

除非Tick事件處理器執(zhí)行的很快,否則 UI 會(huì)失去響應(yīng)。
這使得 WPF 和 Windows Forms 定時(shí)器僅適用于小任務(wù),通常就是那些更新 UI 外觀的任務(wù)(例如,顯示時(shí)鐘或倒計(jì)時(shí))。否則,你就需要多線程定時(shí)器。

在精度方面,單線程定時(shí)器與多線程定時(shí)器類似(幾十毫秒),但是通常精度更低,因?yàn)樗鼈儠?huì)被其它 UI 請(qǐng)求(或其它定時(shí)器事件)推遲。

單線程計(jì)時(shí)器基于Windows消息循環(huán),應(yīng)用程序會(huì)同步的處理計(jì)時(shí)器的消息。會(huì)發(fā)現(xiàn)UI界面相應(yīng)速度比較慢。解決這個(gè)問(wèn)題的方法是使用多線程計(jì)時(shí)器。
單線程計(jì)時(shí)器的缺點(diǎn):除非Tick事件的處理代碼執(zhí)行的非常快,否則UI界面會(huì)變得響應(yīng)很慢。所以 WPF和Windows Forms的計(jì)時(shí)器都非常適合小任務(wù),尤其是界面更新的任務(wù)。例如時(shí)鐘和計(jì)數(shù)顯示。否則,你需要一個(gè)多線程計(jì)時(shí)器


聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

.NET Framework中定時(shí)器timer的單線程與多線程使用講解

.NET Framework中定時(shí)器timer的單線程與多線程使用講解:如果你需要使用規(guī)律的時(shí)間間隔重復(fù)執(zhí)行一些方法,最簡(jiǎn)單的方式是使用定時(shí)器(timer)。與下邊的例子相比,定時(shí)器可以便捷、高效地使用內(nèi)存和資源: new Thread (delegate() { while (enabled) { DoSomeAction(); Thread.Sleep (T
推薦度:
標(biāo)簽: net framework 定時(shí)器
  • 熱門(mén)焦點(diǎn)

最新推薦

猜你喜歡

熱門(mén)推薦

專題
Top
主站蜘蛛池模板: 国产精品免费观看网站 | 日韩第一页在线 | 日韩经典在线 | 欧美日韩国产在线人 | 成人免费国产欧美日韩你懂的 | 欧美 日韩 国产 色 欧美 日韩 中文 | 精品国产不卡一区二区三区 | 国产精品久久久久久永久牛牛 | 亚洲欧美天堂网 | 欧美精品色精品一区二区三区 | 国产精品123 | 久久91精品国产91久久户 | 中文字幕日韩一区二区三区不卡 | 国内偷拍第一页 | 亚洲精品国产自在久久出水 | 国产一区在线免费观看 | 国产欧美一区二区精品性色99 | 久久国语精品 | 亚洲一区 中文字幕 | 欧美国产成人精品一区二区三区 | 日韩激情影院 | 欧美国产日韩在线播放 | 国产精品免费观看网站 | 在线不卡日韩 | 激情另类国内一区二区视频 | 久久精品香蕉 | 国产欧美在线观看 | 免费a一毛片 | 久久久国产99久久国产久 | 五月天婷婷视频 | 国产九九精品 | 日韩欧美一区二区三区不卡视频 | 91精品成人免费国产 | 日韩亚洲欧美日本精品va | 在线观看视频亚洲 | 成人国产一区二区三区精品 | 日日做夜夜爱 | 久久久国产成人精品 | 人与动性xxxxx免费 | 欧美日韩国产精品 | 欧美一区三区 |