【发布时间】:2022-02-14 22:16:12
【问题描述】:
我对异步方法没有太多经验,我不确定我是否正确地使用了每个方法。在某些情况下,我在以下行中获取索引超出范围异常:“listPages.Add”
private static int SetPages(FileDocument document, List<PageDTO> pages, string tableName, Entities entity, int accessID)
{
List<Page> listPages = new List<Page>();
Parallel.ForEach(pages, new ParallelOptions { MaxDegreeOfParallelism = 8 }, page =>
{
string docPath = GetPathString(page.PageID);
if (File.Exists(docPath))
{
byte [] docBytes = ConvertToWebP(docPath);
if(docBytes.Length > 0)
{
var fileStreamID = InsertInDatabase(docBytes, page.PageID, tableName);
listPages.Add(SetPage(document, page.PageNumber, fileStreamID, tableName, accessID));
}
}
});
entity.FilePages.AddRange(listPages);
return listPages.Count();
}
【问题讨论】:
-
您的代码不是线程安全的。您不应该在
Parallel.ForEach正文中使用共享的可变集合。 -
你的方法不是异步的,它是静态的
-
“使用 Parallel.ForEach 的异步方法” - 不,只是不。不。 ;D
-
Parallel专为 CPU 绑定操作而设计,因此请勿用于 I/O 绑定异步操作。
标签: c#