Страницы

Поиск по вопросам

понедельник, 17 июня 2019 г.

Работа с Thread.Sleep();

Подскажите, как работает метод 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

Комментариев нет:

Отправить комментарий