并行处理的问题

本文关键字:问题 并行处理 | 更新日期: 2023-09-27 17:56:22

这是一个控制台应用程序,我有一个foreach,它循环访问Id列表并从映射器(数据库)获取该ID的数据。为每个列表获取数据后,它将创建 csv 文件。有近 84 个列表,每个列表都有 1000 个 ID。我在内存不足异常时拆分了它。

 List<TruckSpec> ts = null;
 Parallel.ForEach(lists, list =>
        {
             string csv = string.Empty;
            long max = list.Max();
            long min = list.Min();
            ts = tsmapper.SelectByList(min, max);
            GetCSV(delimeter, ts, nameofile, filepath, mqftcall);     
        });

因此,我决定使用并行处理来加快该过程。

但是,问题是映射器函数 selectByList(最小值、最大值)值会针对每个列表进行更改。我在运行映射器函数时收到此错误"集合已修改:枚举可能无法执行"。

你能在这里帮我吗?我不应该在这种情况下使用parallel.foreach吗?如果我可以使用 parallel.froeach 如何解决此问题。

并行处理的问题

请记住,使用多处理时,您可以随时进行上下文切换。你可以点击第 7 行(ts = tsmapper。SelectByList(min, max);),然后在点击第 8 行之前再点击第 7 行 3 次。最后,一旦你用第一个线程点击第 8 行,数据可能会发生重大变化。

或者,当上下文切换发生时,GetCSV 可能正忙于遍历 ts,从而更改数据。

根据您的用法,看起来列表 ts = null; 应该只是在并行循环内部声明,而不是在并行循环外部声明。