在C#中异步等待导致list / enumerable的额外迭代

时间:2017-02-14 01:56:05

标签: c# .net wpf asynchronous iteration

我在一个小的C#WPF应用程序中使用Async和Await,以便在后台运行长处理操作时阻止gui被阻止。我的应用程序的上下文是从CSV读取数据并将其转换为XML文档。

当我使用输入列表计数为1999的项目运行以下内容时,最终得到的迭代次数约为8000次。

**** Main Thread ****
    outputItems = await CreateOutputItems(inputItems);
**** End Main Thread ****

public async Task<IEnumerable<ConvertedEntity>> CreateOutputItems(IEnumerable<InputEntity> inputItems)
    {
        return await Task.Run(() => inputItems.Select(CreateOutputItemFromInputItem));
    }

当我删除它并在主线程中作为程序循环运行时,我得到正确的1999迭代。

var convertedItems = new List<ConvertedEntity>();

foreach (var inputItem in inputItems)
{
      var outputItem = CreateOutputItemFromInputItem(inputItem);
      convertedItems.Add(outputItem);
}

另外我注意到在使用async await时,ConvertedEntity中包含ID号(只是循环/迭代号)的字段已损坏。例如,值为2000,4000,6000到30,000。当我使用foreach循环时,它们是预期的1,2,3,4,5等。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

在方法中添加int输入参数,以便您可以将Select版本与索引一起使用,然后使用该索引i正确设置ID

public ConvertedEntity CreateOutputItemFromInputItem(InputEntity x, int i) 
{  
  // now use i to set the ID

.ToList()后添加Select(CreateOutputItemFromInputItem),以便在Task.Run

中执行它