c# - 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。但这不是确定性的。我应该怎么办?
解决方案
你有所谓的竞争条件。您在没有同步的情况下从多个线程访问列表,这导致它处于奇怪的状态。
您可以改用 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);
推荐阅读
- java - @Bean 和 Spring 中的 Autowired 有什么区别?
- ajax - 在 laravel 5.7.14 中使用命名空间时出现此错误
- gradle - Android Gradle 插件:将 NDK 可执行文件打包到 APK 中
- javascript - 当我使用模板文字并运行代码时,结果未定义
- python - 涉及序列的任务需要多少个 RNN 单元?
- testing - 如何在jmeter中每25分钟运行一个线程
- javascript - Reactjs Facebook 登录库的问题 - 使 componentClicked 函数异步
- highcharts - Highstock 工具提示“标签”未呈现
- r - R/闪亮的数据框列
- python - Tinkerpop & Python - 通过 gremlin 设置数组属性