Изменение длины очереди во время обработки

У меня есть очередь показа изображений. Я беру изображение из очереди, показываю его, жду две секунды и беру следующее. Однако очередь заполняется событиями извне, поэтому в нее могут добавляться элементы, пока другие обрабатываются. В моем коде вызов метода ShowImage() приводит к созданию параллельного цикла, поэтому изображения следуют без задержки. Как я могу решить эту проблему?

// Метод вызывается по событию.
private void AddImageToSchedule(int imgNumber)
 {
     switch (imgNumber)
     {
     case 1:
         _schedule.Enqueue(_images[ImagesNames.FirstBlood]);
         break;

     case 2:
         _schedule.Enqueue(_images[ImagesNames.DoubleKill]);
         break;

     case 3:
         _schedule.Enqueue(_images[ImagesNames.TripleKill]);
         break;

     case 4:
         _schedule.Enqueue(_images[ImagesNames.UltraKill]);
         break;

     case 5:
         _schedule.Enqueue(_images[ImagesNames.Riot]);
         break;
 }
 
 ShowImage();
}

private async void ShowImage()
{
 while (_schedule.Count != 0)
 {
     var img = _schedule.Dequeue();
     _ui.ShowImage(img);
     await Task.Delay(SHOW_TIME);
 }
}

Ответы (1 шт):

Автор решения: tym32167

Можно просто цикл завсти бесконечный и в нем проверять очередь на элементы внутри.

Пример

class MyForm : Form
{
    public MyForm()
    {
        this.Load += (sender, args) => CheckQueue();
        this.FormClosed += (sender, args) => isClosed = true;

        var button = new Button() { Text = "pressMe" };
        button.Click += (sender, args) => messages.Enqueue("Hello!");
        this.Controls.Add(button);
    }

    private bool isClosed = false;
    private Queue<string> messages = new Queue<string>();

    private async void CheckQueue()
    {
        while (!isClosed)
        {
            if (messages.Count > 0)
            {
                MessageBox.Show(messages.Dequeue());
            }
            await Task.Delay(1000);
        }
    }
}

Тест

new MyForm().ShowDialog();

Вывод

введите сюда описание изображения

→ Ссылка