[英]Thread vs Timer in C#
我有兩種檢查數據的實現:
使用System.Timers.Timer
:
public void startTimer()
{
try
{
System.Timers.Timer timer = new System.Timers.Timer(1);
timer.AutoReset = true;
timer.Elapsed += new ElapsedEventHandler(commStart);
timer.Enabled = true;
timer.Start();
}
catch(Exception ex){}
}
private void commStart(){object sender, EventArgs eArgs}
使用Thread
:
public void startThread()
{
Thread threadGeneralComm = new Thread(new ThreadStart(commStart));
threadGeneralComm.Start()
}
private void commStart()
{
while(true)
{
// checking data
Thread.Sleep(1);
}
}
所以你可以看到,兩種實現方式,它都會檢查數據並等待1毫秒。 人們向我抱怨說使用 Timer 比使用 Thread 更糟糕,而使用 Thread 的速度要快 10 倍。 是這樣嗎?
兩種選擇都很差。 它們是輪詢方法,因此在沒有數據時會無緣無故地使用 CPU。
如果您不能使用事件驅動的方法,那么您應該尋找基於阻塞隊列的解決方案。
Windows 應用程序基於事件驅動架構。 鼠標移動、按鍵、顯示 UI、移動 window、調整大小等都是事件。 當您的應用程序發生事件時,windows 將該事件分配給稱為應用程序隊列的東西,並且 window 應用程序應具有從應用程序隊列獲取事件的連續循環,並使用調度程序處理事件。
這樣,一個TIMER就是一個事件,注冊后,操作系統會將定時器消息放到應用隊列中,以便應用程序處理這個定時器。 TIMER 始終在 UI 線程上工作。 因此,是否將 TIMER 事件放入應用隊列取決於操作系統。 當操作系統太忙時,您可能會錯過計時器事件。
線程具有獨立的執行上下文,保證執行。
解決方案的區別
解決方案之間的主要區別在於,計時器將每毫秒調用一次,而單線程解決方案將在每次數據檢查之間等待一毫秒。
在計時器解決方案中,數據檢查將並行發生 - 每個回調都在線程池中的不同線程上完成。
例如,當使用間隔為 10 毫秒的計時器並且回調方法需要 20 毫秒來處理時,線程池中的多個線程上會有多個活動的回調。
單線程更好(在這種情況下)
假設在您的示例中處理時間超過 1 毫秒,它解釋了為什么它比單線程慢得多。
我認為可能有比這更好的解決方案 - 使用數據庫觸發器、一些事件或回調......但如果獲取信息的唯一方法是主動檢查數據,那么使用單線程解決方案會更好。
如果您正在等待數據以文件的形式出現,您可以使用FileSystemWatcher
輪詢總是資源密集型的,最好使用好萊塢原則設計模式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.