【问题标题】:c# Parallel.ForEach throwing indexOutOfBoundExceptionc# Parallel.ForEach 抛出 indexOutOfBoundException
【发布时间】:2016-04-01 08:08:44
【问题描述】:

我使用了很多 parallel foreach 循环。它们主要用于详细说明数据并将它们添加到列表中。

这是我的方法的一个例子:

System.Threading.Tasks.Parallel.ForEach(magazzini, m =>
{
    try
    {
        warehouse.Add(new WAREHOUSE()
        {
            ID = m.Id,
            NAME = m.new_name,
            CODE = m.new_codice,
            INTEGRATION_KEY = m.dynamics_integrationkey,
            RESOURCE_ID = m.new_mobileuser == null ? Guid.Empty : m.new_mobileuser.Id
        });
    }
    catch (Exception ex)
    {
        Logging.Error(authToken, string.Format("GetAllMagazzini|Magazzini|{0}", ex.InnerException));
    }
});

我在this old post 中读到它可能是由List<T> 的非线程安全属性引起的。我的问题如下:

我不仅有像这样的 for 循环,而且还有包含大量操作的长循环。我不得不使用parallel.foreach,因为使用经典的foreach 会使查询超时,因为它位于WebService 上。

如何使用parallel.foreach 避免indexOutOfBoundException?我必须将List<T> 更改为其他内容?

【问题讨论】:

    标签: c# multithreading foreach parallel-processing indexoutofboundsexception


    【解决方案1】:

    是的,将List<T> 更改为ConcurrentBag<T>,因为在List<T> 中调整后备数组的大小会导致并发写入操作出现问题。另一种选择是围绕添加操作创建一个lock

    如果没有其他操作,添加Parallel.ForEach 并发是不必要的,甚至会对性能产生负面影响。如果是这种情况,请创建一个普通的foreach 或使用AddRange

    【讨论】:

    • 非常感谢!只是一个小问题:为什么如果只有添加操作会对性能产生负面影响?如何知道是使用并行还是非并行foreach?
    • 不能并行调整数组大小,不能并行设置内存地址。所以这将是一个不支持并发。如果你得到一个文件的内容,一个网页,你可以让多个动作彼此相邻运行,这样就可以实现并发。
    猜你喜欢
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多