我试图在一段时间间隔后异步执行代码,并且只想在完成代码执行后再次检查以防止重叠。为此,我使用以下变量和计时器代码。
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”显示为空。请让我知道我做错了什么。谢谢
我不知道你为什么得到NullReferenceException
在你的代码中,但我建议废弃Timer
完全方法并用更简单的方法替换它Task.Delay https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.delay循环中:
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。这是你必须考虑的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)