我在一个小的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等。
有什么想法吗?
答案 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