3 回答

TA貢獻1809條經驗 獲得超8個贊
對于此用例,您實際上并不需要計時器。這是每 x 秒連續調用一個函數的一種方法(在控制臺程序中):
class Program
{
static Task statusCheckingTask;
static void Main(string[] args)
{
statusCheckingTask = CheckStatusTask(10);
Console.ReadLine();
}
static async Task CheckStatusTask(int delayInSeconds)
{
while (true)
{
await CheckStatus();
await Task.Delay(TimeSpan.FromSeconds(delayInSeconds));
}
}
static async Task CheckStatus()
{
Console.WriteLine("Checking status...");
await Task.FromResult(0);
}
}

TA貢獻1862條經驗 獲得超7個贊
如果您想每 250 毫秒觸發一次狀態檢查,無論之前的嘗試結果如何,請使用以下命令:
while (true)
{
Task.Run(() => statusChecker.CheckStatus(autoEvent));
await Task.Delay(TimeSpan.FromSeconds(250));
}
如果您只想在上一次嘗試完成時觸發狀態檢查,請使用以下命令:
while (true)
{
await statusChecker.CheckStatus(autoEvent);
await Task.Delay(TimeSpan.FromSeconds(250));
}
兩種情況都假設statusChecker.CheckStatus返回一個Task對象,例如:
public async Task CheckStatus(object autoEvent)
{
// some async status checking
}

TA貢獻1835條經驗 獲得超7個贊
我建議使用 Microsoft 的 Reactive Framework (NuGet "System.Reactive" and add using System.Reactive.Linq;),然后你可以這樣做:
IObservable<bool> query =
from n in Observable.Interval(TimeSpan.FromSeconds(10.0))
from s in Observable.FromAsync(() => statusChecker.CheckStatus())
select s;
IDisposable subscription =
query.Subscribe(status =>
{
/* Do something with each `status` as it arrives */
});
這假設.CheckStatus()返回Task<bool>.
這一切都是通過后臺線程完成的,并且是異步的。只需調用subscription.Dispose()停止間隔計時器。簡單的。
- 3 回答
- 0 關注
- 296 瀏覽
添加回答
舉報