在我的一个应用程序中,我创建了一种队列列表,以便我的应用程序可以按正确的顺序发送midi信号。
因此,每当我想播放midi-note时,我都会将midinote添加到列表中。
我还有一个后台工作人员正在运行,它会不断检查“队列”中是否有等待记录,如果有,他会将其发送到输出设备。
现在我想对此进行压力测试,20个中的19个完美无缺。每隔一段时间,我就会得到一个nullexception错误。事实是,我不知道为什么它会给我这个错误。
我唯一可以想到的是,在背景工作者检查队列中是否有等待的时候,还有第二个参数仍然缺少,这就是为什么他拖出错误
然而,当我查看队列的内容时,它就在那里。
让我告诉你代码:
public class queueClass
{
public int note {get; set;}
public int delay { get; set; }
public queueClass(int selectedNote, int selectedDelay)
{
note = selectedNote;
delay = selectedDelay;
}
}
List<queueClass> midiQueue = new List<queueClass>();
public void playNote(int noteNumber, int delay)
{
if (Enabled)
{
// ADD THE NOTE TO THE QUEUE
midiQueue.Add(new queueClass(noteNumber, delay));
if (!bgwMidi.IsBusy)
{
bgwMidi.RunWorkerAsync();
Console.WriteLine(DateTime.Now + " >>> BACKGROUNDWORKER MIDI STARTED");
}
}
}
private void bgwMidi_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
while (worker.IsBusy)
{
if (worker.CancellationPending)
{
e.Cancel = true;
break;
}
else
{
// CHECK IF THERE IS A MIDINOTE IN THE QUEUE
if (midiQueue != null && midiQueue.Count > 0)
{
if (midiQueue[0].note > -1 && midiQueue[0].delay > -1)
{
sendNote(midiQueue[0].note, midiQueue[0].delay);
}
}
}
}
}
此代码的第一行引发错误:
if (midiQueue[0].note > -1 && midiQueue[0].delay > -1)
{
sendNote(midiQueue[0].note, midiQueue[0].delay);
}
它说:
对象引用未设置为对象的实例
然而,当我查看我的midiQueue时,它保留了值:
延迟:0
注意:5
现在我试图通过将它放入try-catch块来绕过错误,但我想知道是什么导致了这个问题。
有人对此有所了解吗?
谢谢!
答案 0 :(得分:4)
如果在不同的线程中完成这些操作,则应在添加或删除项目时锁定midiqueue。
推送商品时:
lock (midiQueue) { midiQueue.Add(new queueClass(noteNumber, delay)); }
弹出项目时:
lock (midiQueue) { /* the pop operation(s) */
使用物品时:
lock (midiQueue)
{
if (midiQueue != null && midiQueue.Count > 0)
{
if (midiQueue[0].note > -1 && midiQueue[0].delay > -1)
sendNote(midiQueue[0].note, midiQueue[0].delay);
}
}
答案 1 :(得分:0)
你检查一下:
midiQueue != null && midiQueue.Count > 0
所以从那里你知道你有一个instanciated midiQueue和midiQueue中的至少一个元素。
然后你这样做:
midiQueue[0].note > -1 && midiQueue[0].delay > -1
这是你的问题。如果midiQueue [0]为null,则midiQueue [0] .note将抛出“对象引用未设置为对象的实例”异常。
所以你应该修改你的测试:
if (midiQueue != null && midiQueue.Count > 0)
{
if (midiQueue[0] != null && midiQueue[0].note > -1 && midiQueue[0].delay > -1)
{
sendNote(midiQueue[0].note, midiQueue[0].delay);
}
}