首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C#中的异步等待导致列表/枚举的额外迭代

C#中的异步等待导致列表/枚举的额外迭代
EN

Stack Overflow用户
提问于 2017-02-14 09:56:05
回答 1查看 97关注 0票数 0

我在一个小的C# WPF应用程序中使用异步和等待,这样我就可以在后台运行长时间的处理操作时阻止gui被阻塞。我的应用程序的上下文是从CSV读取数据并将其转换为XML文档。

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

代码语言:javascript
代码运行次数:0
运行
复制
**** 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次迭代。

代码语言:javascript
代码运行次数:0
运行
复制
var convertedItems = new List<ConvertedEntity>();

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

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

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-14 13:14:35

int输入参数添加到您的方法中,这样您就可以使用带有索引的Select版本,然后使用该索引i来正确设置ID

代码语言:javascript
代码运行次数:0
运行
复制
public ConvertedEntity CreateOutputItemFromInputItem(InputEntity x, int i) 
{  
  // now use i to set the ID

还要在Select(CreateOutputItemFromInputItem)后面添加一个.ToList(),这样它就可以在Task.Run中执行它

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42216574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档