多執行緒計時器
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
)Start
&Stop
方法如果你被Enabled
屬性弄糊塗(上面點)AutoReset
- 表示經常性事件(default value = true
)SynchronizingObject
屬性,帶有Invoke
和BeginInvoke
方法,用於在 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
。