首先,我將解釋一個簡短的場景;線程安全隊列 - 入隊/出隊
作爲來自某些設備觸發器的信號,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
{
}
}
所以我的問題是,我怎麼讓這個更多...線程安全?這樣我就不會遇到這些問題。也許有些東西是,將隊列複製到另一個隊列中工作,然後將從原始隊列處理的警報出隊?
編輯:剛剛被告知併發隊列中,將檢查了這一點,現在
您應該首先從隊列中彈出項目,然後使用通用的線程安全隊列實現來發送SendAlarm。如果您無法處理某件物品,請再次入列。 – cdleonard