在线程代码中复制列表时出错

本文关键字:列表 出错 复制 线程 代码 | 更新日期: 2023-09-27 18:35:47

当我的机器负载很重时,我的线程代码出错。 当机器负载较轻时,不会发生错误。 我正在使用VS 2013,C# 5.0和.NET 4.51。

代码如下所示:

private static readonly Object lockGetData = new Object();
public static void GetData(string symbol, out List<Tuple<double, double>> velocityLine)
{
   try
   {
      lock (lockGetData)
      {
         mData = mSymbols[symbol];
         Debug.Assert(mData != null, "Oh crap! mData is null");
         velocityLine = new List<Tuple<double, double>>(mData.velocityLine);
         return;
      }
   } 
   catch (Exception ex)
   {
      DebugPrint("GetData error.'n" + ex.Message, symbol);
      velocityLine = new List<Tuple<double, double>>();
      return 0.0;
   } 
}

我在线收到错误:

velocityLine = new List<Tuple<double, double>>(mData.velocityLine);

错误消息是:"目标阵列不够长。检查目标索引和长度,以及数组的下限。

当错误发生时,当我检查"速度线"的长度时,它是空的。

我不明白为什么会出现此错误。 任何帮助或建议将不胜感激。

查尔斯

在线程代码中复制列表时出错

如果没有完整的代码示例,则不清楚如何使用 mData 集合对象。但鉴于该错误,实际上可以肯定的是,当List<T>构造函数正在执行时,该对象正在被其他线程修改,结果是该集合的长度在List<T>构造函数使用其长度初始化后备数组的时间与然后尝试将所有元素从mData对象复制到后备数组的时间之间发生变化。

仅同步velocityLine对象是不够的。还必须同步对用于初始化mData对象的任何访问。

最后,我要指出的是,在这里有一个try/catch (Exception)子句是非常糟糕的形式(假设你的版本实际上有一个有效的return语句,而不是这里发布的内容)。如果你把它放在那里只是为了调试这段代码,那很好......但是现在你知道出了什么问题,你应该删除它。这将确保如果存在任何其他错误,您将被迫修复它们,而不是神秘地只是在随机时间做一些与您想要的不同的事情。