我正在使用线程定时器来执行一些定期的工作:
private static async void TimerCallback(object state)
{
if (Interlocked.CompareExchange(ref currentlyRunningTasksCount, 1, 0) != 0)
{
return;
}
var tasksRead = Enumerable.Range(3, 35).Select(i => ReadSensorsAsync(i));
await Task.WhenAll(tasksRead);
var tasksRecord = tasksRead.Where(x => x.Result != null).Select(x => RecordReadingAsync(x.Result));
await Task.WhenAll(tasksRecord);
Interlocked.Decrement(ref currentlyRunningTasksCount);
}
我让计时器回调使用async
并使用WhenAll
。在每个工作的异步函数中,我都有一个控制台输出,显示活动。现在问题是,在第二个定时器事件中,由于某种原因,每个异步函数会工作两次。计时器设置为长时间间隔。该应用程序为Windows控制台类型。是Select
导致它运行两次吗?
Select(i => ReadSensors)
后添加ToArray
,这样你可能会枚举两次可枚举对象,一次在WhenAll
中,另一次在tashsRead.Where
中。 - csharpfolk