首先,我将解释一个简短的场景;
作为来自某些设备的信号触发,警报类型的对象被添加到队列中。每隔一段时间,就会检查队列,并且对于队列中的每个警报,它都会触发一个方法。
但是,我遇到的问题是,如果在遍历队列时将警报添加到队列中,则会引发错误,说明队列在您使用时已更改。这是显示我的队列的一些代码,假设警报不断插入其中;
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
{
}
}
所以我的问题是,我如何使这个更...线程安全?这样我就不会遇到这些问题。也许类似于将队列复制到另一个队列,处理那个队列,然后将原始队列中处理的警报出队?
编辑:刚刚被告知并发队列,现在检查一下