我正在尝试改进一些代码,并希望创建一个更通用的实现来创建运行异步的计时器。在下面的情况下,MethodA按预期工作,每4秒写入控制台。我希望MethodB也可以工作,但不管怎么说它只执行一次。
public async Task InitTimers()
{
MethodA(TimeSpan.FromSeconds(4));
MethodB(TimeSpan.FromSeconds(4), ExecTimer());
}
private async Task MethodA(TimeSpan refreshTime)
{
var aTimer = new Timer();
aTimer.Elapsed += (s, e) => ExecTimer().ConfigureAwait(false);
aTimer.Interval = refreshTime.TotalMilliseconds;
aTimer.Enabled = true;
// Immediately trigger first time
ExecTimer().ConfigureAwait(false);
}
private async Task MethodB(TimeSpan refreshTime, Task task)
{
var aTimer = new Timer();
aTimer.Elapsed += (s, e) => task.ConfigureAwait(false);
aTimer.Interval = refreshTime.TotalMilliseconds;
aTimer.Enabled = true;
// Immediately trigger first time
task.ConfigureAwait(false);
}
private async Task ExecTimer()
{
Console.WriteLine("Hello World!");
}
知道导致MethodB只运行一次的原因吗?
答案 0 :(得分:2)
一旦方法Timer
/ MethodA
完成,MethodB
在超出范围时就会被处置掉。您需要在Task
之外创建它们,否则保持Task
正在运行,Timer
在范围内