我有一个整数列表,每次引发一个事件时都会在主线程中更新。然后,当引发另一个事件时,我想读取该列表的值并处理它们。但是,当我读取列表的值时,我得到错误索引超出了数组的范围。我想这是因为多线程,但我添加了锁并仍然发生。这段代码是否安全?
每当有新数据时,列表都会更新。
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);
}
}
}
答案 0 :(得分:1)
这不是并发问题。这是一个指数问题。
triggerSignal[1, i]
应该是
triggerSignal[0, i]