Подскажите, как работает метод Thread.Sleep(); в таком кусочке кода, к примеру
listBox1.Items.Add("First Item");
Thread.Sleep(5000);
listBox1.Items.Add("Second Item");
Получается так, что когда выполняется этот кусок кода, сначало идет задержка, а потом сразу же добавляются 2 объекта в listbox. Но нужно, что бы сперва добавился первый объект, прошло 5 секунд и только потом второй. Что делаю не так?
Ответ
Вообще-то приведенный код работает именно так, как вы и написали: сначала добавляется первая запись, потом делается задержка потока, потом добавляется вторая запись. А вот видите вы другой результат: сначала задержка, потом добавление двух записей. Это происходит из-за того, что задержку вы делаете в главном, UI, потоке. У UI потока есть т.н. очередь сообщений, которую он обрабатывает. После добавления первой записи в эту очередь добавляется сообщение о том, что нужно нарисовать текст в контроле. Но поскольку вы тут же делаете задержку, обработка этой очереди останавливается и поток просто не успевает нарисовать первую запись в контроле. После того, как задержка заканчивается, в очередь добавляется еще одно сообщение, и поток отрисовывает обе записи.
Сложно посоветовать, как это исправить, поскольку непонятно, чего вы хотите добиться. К тому же делать задержки (особенно в UI потоке) -- как правило плохая идея. Как вариант -- можно попросить UI поток обработать очередь сообщений перед задержкой:
listBox1.Items.Add("First Item");
Application.DoEvents();
Thread.Sleep(5000);
listBox1.Items.Add("Second Item");
Но, повторюсь, это только в порядке удовлетворения любопытства. По-хорошему от задержки надо избавляться и делать то, что вы хотите, по-другому. Например, использовать таймер или async/await
Комментариев нет:
Отправить комментарий