【发布时间】:2016-06-18 16:47:18
【问题描述】:
我正在使用线程定时器来做一些周期性的工作:
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中第二次枚举
标签: c# async-await task-parallel-library