当Task作为参数传递时,计时器不工作

时间:2017-10-13 11:09:03

标签: c# asynchronous timer task

我正在尝试改进一些代码,并希望创建一个更通用的实现来创建运行异步的计时器。在下面的情况下,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只运行一次的原因吗?

1 个答案:

答案 0 :(得分:2)

一旦方法Timer / MethodA完成,MethodB在超出范围时就会被处置掉。您需要在Task之外创建它们,否则保持Task正在运行,Timer在范围内