我有一些代码循环遍历记录列表,为每个记录启动一个导出任务,并在每次任务完成时将进度计数器增加 1,以便用户知道该过程有多远。
但是根据我的循环时间,我经常看到输出在一个较低的数字之前显示一个较高的数字。
例如,我希望看到这样的输出:
出口 A 出口 B 导出 C 出口 D 出口电子 完成 1 / 5 完成 2 / 5 完成 3 / 5 完成 4 / 5 完成 5 / 5
但相反,我得到这样的输出
出口 A 出口 B 导出 C 出口 D 出口电子 完成 1 / 5 完成 2 / 5 完成 5 / 5 完成 4 / 5 完成 3 / 5
我不希望输出是准确的,因为当我更新/使用它时我没有锁定该值(有时它输出相同的数字两次,或者跳过一个数字),但是我不希望它倒退。
我的测试数据集是72个值,相关代码如下:
var tasks = new List<Task>();
int counter = 0;
StatusMessage = string.Format("Exporting 0 / {0}", count);
foreach (var value in myValues)
{
var valueParam = value;
// Create async task, start it, and store the task in a list
// so we can wait for all tasks to finish at the end
tasks.Add(
Task.Factory.StartNew(() =>
{
Debug.WriteLine("Exporting " + valueParam );
System.Threading.Thread.Sleep(500);
counter++;
StatusMessage = string.Format("Exporting {0} / {1}", counter, count);
Debug.WriteLine("Finished " + counter.ToString());
})
);
}
// Begin async task to wait for all tasks to finish and update output
Task.Factory.StartNew(() =>
{
Task.WaitAll(tasks.ToArray());
StatusMessage = "Finished";
});
输出可以在调试语句和StatusMessage
输出中向后出现。
计算一个循环中有多少异步任务已完成以便不会发生此问题的正确方法是什么?