Thread-safe file d'attente - mise en File / file d'attente

Tout d'abord, je vais vous expliquer un court scénario;

Comme un signal à partir de certains dispositifs déclencheurs, un objet de type d'Alarme est ajouté à la file d'attente. Dans un intervalle de temps, la file d'attente est cochée, et pour chaque Alarme dans la file d'attente, il déclenche une méthode.

Cependant, le problème je suis en cours d'exécution en est que, si une alarme est ajouté à la file d'attente alors qu'il est en cours de traversée, il déclenche une erreur de dire que la file d'attente a changé alors que vous l'utilisiez. Voici un peu de code pour montrer ma file d'attente, il suffit de supposer que les alarmes sont constamment inséré;

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
        {
        }
    }

Donc ma question est, comment puis-je faire de plus... "thread-safe"? De sorte que je ne vais pas courir sur ces questions. Peut-être quelque chose le long des lignes de, de la copie de la file d'attente à une autre file d'attente, de travail, puis dequeueing les alarmes qui ont été traitées à partir de l'original de la file d'attente?

edit: juste été informé de concurrente de la file d'attente, permettra de vérifier cette maintenant

Vous devriez pop des éléments de la file d'attente et SendAlarm seconde, ainsi que l'utilisation d'un générique thread-safe file d'attente de mise en œuvre. Si vous ne pouvez pas manipuler un élément, puis mettre en file d'attente à nouveau.

OriginalL'auteur Shane.C | 2012-11-16