异步System.Threading.Timer有时会引发null异常

时间:2020-04-13 16:18:07

标签: c# wpf timer async-await

我正在尝试在一定时间间隔后异步执行代码,并且仅在完成代码执行以防止重叠之后才想再次检查。为此,我正在使用以下变量和计时器代码。

private System.Threading.Timer _timer;
private int _intervalInMilliSec = 10000;

_timer = new System.Threading.Timer(async (o) =>
{
    // Stop the timer;
    _timer.Change(-1, -1);

    // awaited api call goes here

    // start timer again (BeginTime, Interval)
    _timer.Change(_intervalInMilliSec, _intervalInMilliSec);
}, null, 0, _intervalInMilliSec);

在大多数情况下,它运行良好,但有时我很少在_timer.Change(-1, -1);行出现以下异常

对象引用未设置为对象的实例

此时,“ o”显示为空。请让我知道我在做什么错。谢谢

1 个答案:

答案 0 :(得分:0)

我不知道为什么在代码中得到NullReferenceException,但是我建议完全放弃Timer方法,并在循环中将其替换为更简单的Task.Delay:< / p>

var apiCallCts = new CancellationTokenSource();
var apiCallTask = Task.Run(async () =>
{
    while (true)
    {
        var delayTask = Task.Delay(TimeSpan.FromSeconds(10), apiCallCts.Token);
        await SomeApiCallAsync();
        await delayTask;
    }
});

在应用关闭时:

apiCallCts.Cancel();

在API失败的情况下,上述解决方案具有不同的行为。不会崩溃的应用程序,而是会自动停止调用API。这是您必须考虑的事情。