在多线程应用程序中,索引超出了界限

本文关键字:界限 索引 多线程 应用程序 | 更新日期: 2023-09-27 18:21:13

我有一个整数列表,每次引发事件时都会在主线程中更新。然后,当引发另一个事件时,我想读取这个列表的值并处理它们。然而,当我读取列表的值时,我得到错误索引超出了数组的界限。我想这是因为多线程的原因,但我添加了锁,并且仍然在发生。这个代码线程安全吗?

每次有新数据时,列表都会更新。

public void onDataRead(object source, DataEventArgs e)
{
  lock (_bufferTriggerSignal)
  {
          for (int sampleIdx = 0; sampleIdx < e.rawData.Length; sampleIdx++)
          _bufferTriggerSignal.Add((int)e.rawData[sampleIdx]);
   }
}   

然后,一旦引发OnPresentationEndEvent,数据就会转换为数组并进行处理。创建一个新线程来处理数据:

public void OnPresentationEndEvent(object source, EventArgs e)
{
    Thread.Sleep(500) //500ms of extra data are needed before processing it
    Thread _t= new Thread(() => processData());
    _t.Start();                  
}
public void processData()
{
   lock (_bufferTriggerSignal)
   {
    if (_bufferTriggerSignal != null && _bufferTriggerSignal.Count > 0)
    {
         int[] arrayTriggerSignal = _bufferTriggerSignal.ToArray();
         int[,] triggerSignal = new int[1, arrayTriggerSignal.Length];
         for (int i = 0; i < arrayTriggerSignal.Length; i++)
            triggerSignal[1, i] = arrayTriggerSignal[i]; //ERROR INDEX OUT OF BOUNDS
        processData(triggerSignal);
     }
  }
}

在多线程应用程序中,索引超出了界限

这不是并发问题。这是一个索引问题。

triggerSignal[1, i]

应该是

triggerSignal[0, i]