我正在撰寫一個簡化的異步事件驅動Timer類。只是想知道這是否適用于所有條件以及它是否是執行緒安全的。IE,它在呼叫或讀取 Enabled 屬性或設定功能期間失敗的任何可能性AutoReset。
namespace Sandbox
{
public class AsyncTimer
{
public volatile bool AutoReset = true;
volatile bool enabled = false;
public volatile int Interval;
CancellationTokenSource? cts;
public volatile Action? Elapsed;
public bool Enabled { get { return enabled; } }
public AsyncTimer (int interval) => Interval = interval;
public void Start(bool startElapsed = false)
{
if (startElapsed) Elapsed?.Invoke();
enabled = true;
cts = new();
_ = Task.Run(() => RunTimerAsync());
}
public void Stop()
{
enabled = false;
cts?.Cancel();
}
async void RunTimerAsync()
{
while (enabled && !cts!.IsCancellationRequested)
{
await Task.Delay(Interval);
Elapsed?.Invoke();
if (!AutoReset) cts.Cancel();
}
}
}
}
uj5u.com熱心網友回復:
據我所知,這只是Threading.Timer的一個包裝器,周圍有一堆額外的東西,并沒有添加任何實際功能。你的計時器通過呼叫來作業Task.Delay,但這只是一個包裝器Threading.Timer,所以你最好去掉中間人。
您公開的大多數功能已經由此計時器通過呼叫該.Change方法提供。如果你想提供更直觀的界面,我建議包裝這個計時器,或者提供一些擴展方法。
如果您想要保證事件不會同時引發的行為,并且執行時間被添加到周期時間,您應該包裝計時器并設定一些到期時間和無限期。然后在事件處理程式結束時,您將.Change再次呼叫以重新啟動計時器。
如果您撰寫一個簡單的包裝器,Threading.Timer您將更容易確保執行緒安全,因為它Threading.Timer是執行緒安全的。
實際上,我認為您的課程可能是執行緒安全的。但我相當肯定它會導致一些意想不到的行為。例如,.Start()多次呼叫會導致啟動多個回圈。我本來希望這樣的方法是冪等的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/430579.html
上一篇:從流回傳值到父函式
