在我的
例如,即使有两个文件作为输入,
我最初使用的是
Asp.Net Core WebApi Controller
中,我收到了一个IFormFile[] files
。我需要将其转换为List<DocumentData>
。我最初使用了foreach
,它运行良好。但后来决定改用Parallel.ForEach
,因为我会接收很多(>5)文件。
这是我的DocumentData
类:
public class DocumentData
{
public byte[] BinaryData { get; set; }
public string FileName { get; set; }
}
这里是我的Parallel.ForEach
逻辑:
var documents = new ConcurrentBag<DocumentData>();
Parallel.ForEach(files, async (currentFile) =>
{
if (currentFile.Length > 0)
{
using (var ms = new MemoryStream())
{
await currentFile.CopyToAsync(ms);
documents.Add(new DocumentData
{
BinaryData = ms.ToArray(),
FileName = currentFile.FileName
});
}
}
});
例如,即使有两个文件作为输入,
documents
总是给出一个文件作为输出。我错过了什么吗?我最初使用的是
List<DocumentData>
。我发现它不是线程安全的,所以改成了ConcurrentBag<DocumentData>
。但我仍然得到了意外的结果。请帮助我找出问题出在哪里?
Task.WhenAll
,那么你需要对它进行await
。 - DavidGConcurrentBag<DocumentData>
了吧?我可以使用List<DocumentData>
代替。 - fingers10Parallel.ForEach
不支持异步lambda表达式。您可以使用简单的foreach
按顺序执行它们,或者使用Task.WhenAll
并发执行它们。 - Farhad JabiyevSelect
lambda返回DocumentData
,然后await Task.WhenAll(..)
将得到一个DocumentData[]
。 - Stephen Cleary