まず、短いシナリオを説明します。
特定のデバイスからの信号がトリガーされると、アラーム タイプのオブジェクトがキューに追加されます。一定の間隔でキューがチェックされ、キュー内のアラームごとにメソッドが起動されます。
ただし、私が直面している問題は、トラバース中にキューにアラームが追加された場合、使用中にキューが変更されたことを示すエラーがスローされることです。キューを表示するためのコードを次に示します。アラームが常にキューに挿入されていると仮定してください。
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
{
}
}
だから私の質問は、どうすればこれをもっと...スレッドセーフにすることができますか? 私がこれらの問題に遭遇しないように。おそらく、キューを別のキューにコピーし、そのキューで作業してから、元のキューから処理されたアラームをデキューするようなものでしょうか?
編集: 同時実行キューについて通知されたばかりです。今すぐ確認します