索引超出多线程应用程序

时间:2015-11-10 01:05:58

标签: c# multithreading

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

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

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);
     }
  }
}

1 个答案:

答案 0 :(得分:1)

这不是并发问题。这是一个指数问题。

triggerSignal[1, i]

应该是

triggerSignal[0, i]