首页 > 解决方案 > Parallel.For 循环退出太快

问题描述

我正在尝试将所有任务并行添加到列表中,然后等待它们。代码:

List<Task<bool>> tasks = new List<Task<bool>>();                

Parallel.For(0, 500, file =>
{
  tasks.Add(SomeTask());
});

Console.WriteLine("Total tasks = " + tasks.Count);

当我执行以下代码时,有时我会得到任务列表(tasks.Count)的大小为 493 或 500 或 498。但这不是确定性的。我应该怎么办?

标签: c#multithreadingtaskparallel.for

解决方案


你有所谓的竞争条件。您在没有同步的情况下从多个线程访问列表,这导致它处于奇怪的状态。

您可以改用 ConcurrentStack 之类的线程安全对象(或 ConcurrentBag 或 ConcurrentQueue,具体取决于您对集合执行的操作):

ConcurrentStack<Task<bool>> tasks = new ConcurrentStack<Task<bool>>();                

Parallel.For(0, 500, file =>
{
  tasks.Push(SomeTask());
});

Console.WriteLine("Total tasks = " + tasks.Count);

推荐阅读