簡體   English   中英

C# 中的線程與計時器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM