首先,我将解释一个简短的情景;
当某些设备发出信号时,会向队列添加一种名为 Alarm 的对象。在一定时间间隔内,会检查队列,并对队列中每个 Alarm 调用一个方法。
然而,我遇到的问题是,如果在遍历队列时添加了一个警报,则会抛出错误,提示您在使用它时队列已经更改。以下是一小段代码,用于展示我的队列,请假定不断向其中插入报警;
public class AlarmQueueManager
{
public ConcurrentQueue<Alarm> alarmQueue = new ConcurrentQueue<Alarm>();
System.Timers.Timer timer;
public AlarmQueueManager()
{
timer = new System.Timers.Timer(1000);
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Enabled = true;
}
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
DeQueueAlarm();
}
private void DeQueueAlarm()
{
try
{
foreach (Alarm alarm in alarmQueue)
{
SendAlarm(alarm);
alarmQueue.TryDequeue();
//having some trouble here with TryDequeue..
}
}
catch
{
}
}
所以我的问题是,我该如何使其更加...线程安全?这样我就不会遇到这些问题了。也许可以采用将队列复制到另一个队列中,对其进行操作,然后从原始队列中出队已处理的警报的方法?编辑:刚被告知有并发队列,现在来查看一下