以下是示例控制台应用程序,输出如下:
输出每次都不同,但需要在打印结果之前完成所有任务。似乎
Parallel.ForEachAsync
没有等待所有任务完成。我有什么遗漏吗?internal class Program
{
private async static Task Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
await TestParallel();
sw.Stop();
Console.WriteLine("Elapsed={0}", sw.Elapsed);
Console.ReadLine();
}
private static async Task TestParallel()
{
var tests = new List<int>() { 1, 2, 3, 4, 5, 6 };
var options = new ParallelOptions { MaxDegreeOfParallelism = 5,
CancellationToken = CancellationToken.None };
var responses = new List<string>();
await Parallel.ForEachAsync(tests, options, async (testno, cancellationToken) =>
{
var response = await TestTask(testno);
responses.Add(response);
});
foreach (var response in responses)
{
Console.WriteLine(response);
}
}
private static Task<string> TestTask(int testno)
{
System.Threading.Thread.Sleep(1000);
return Task.FromResult($"Test{testno}");
}
}
List<T>
不是线程安全的。可以尝试使用ConcurrentBag<T>
, 看看是否有帮助。 - John Wu