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 关注
- 258 浏览
添加回答
举报