多執行緒計時器

System.Threading.Timer - 最簡單的多執行緒計時器。包含兩個方法和一個建構函式。

示例:計時器呼叫 DataWrite 方法,該方法在五秒鐘後寫入“多執行緒執行…”,然後在此之後每秒寫入一次,直到使用者按 Enter 鍵:

using System;
using System.Threading;
class Program
{
  static void Main()
  {
    // First interval = 5000ms; subsequent intervals = 1000ms
    Timer timer = new Timer (DataWrite, "multithread executed...", 5000, 1000);
    Console.ReadLine();
    timer.Dispose(); // This both stops the timer and cleans up.
  }

  static void DataWrite (object data)
  {
    // This runs on a pooled thread
    Console.WriteLine (data); // Writes "multithread executed..."
  }
}

注意:將釋出一個單獨的部分來處理多執行緒定時器。

Change - 當你想要更改定時器間隔時,可以呼叫此方法。

Timeout.Infinite - 如果你想只開一次。在建構函式的最後一個引數中指定它。

System.Timers - .NET Framework 提供的另一個計時器類。它包裹了 System.Threading.Timer

特徵:

  • IComponent - 允許它安裝在 Visual Studio 的 Designer 元件托盤中
  • Interval 屬性而不是 Change 方法
  • Elapsed event 而不是回撥 delegate
  • Enabled 屬性啟動和停止計時器(default value = false
  • StartStop 方法如果你被 Enabled 屬性弄糊塗(上面點)
  • AutoReset - 表示經常性事件(default value = true
  • SynchronizingObject 屬性,帶有 InvokeBeginInvoke 方法,用於在 WPF 元素和 Windows 窗體控制元件上安全地呼叫方法

表示所有上述功能的示例:

using System;
using System.Timers; // Timers namespace rather than Threading
class SystemTimer
{
  static void Main()
  {
    Timer timer = new Timer(); // Doesn't require any args
    timer.Interval = 500;
    timer.Elapsed += timer_Elapsed; // Uses an event instead of a delegate
    timer.Start(); // Start the timer
    Console.ReadLine();
    timer.Stop(); // Stop the timer
    Console.ReadLine();
    timer.Start(); // Restart the timer
    Console.ReadLine();
    timer.Dispose(); // Permanently stop the timer
 }

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

Multithreaded timers - 使用執行緒池允許一些執行緒為許多計時器提供服務。這意味著每次呼叫回撥方法或 Elapsed 事件都可能在不同的執行緒上觸發。

Elapsed - 此事件始終按時觸發 - 無論之前的 Elapsed 事件是否已完成執行。因此,回撥或事件處理程式必須是執行緒安全的。多執行緒定時器的準確性取決於作業系統,通常為 10-20 毫秒。

interop - 當你需要更高的準確度時,使用它並呼叫 Windows 多媒體計時器。這精度低至 1 毫秒,並在 winmm.dll 中定義。

timeBeginPeriod - 首先呼叫此資訊通知作業系統你需要高計時準確度

timeSetEvent - 在 timeBeginPeriod 之後呼叫它來啟動多媒體計時器。

timeKillEvent - 完成後呼叫此方法,這將停止計時器

timeEndPeriod - 呼叫此方法通知作業系統你不再需要高計時準確度。

你可以在網際網路上找到使用多媒體計時器的完整示例,搜尋關鍵字 dllimport winmm.dll timesetevent