Изменение длины очереди во время обработки
У меня есть очередь показа изображений. Я беру изображение из очереди, показываю его, жду две секунды и беру следующее. Однако очередь заполняется событиями извне, поэтому в нее могут добавляться элементы, пока другие обрабатываются. В моем коде вызов метода 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();
Вывод
