Я пишу окно WinForms в C #, которое отображает около 12 ListBox
и 6 ComboBox
элементов управления, каждый из которых содержит от нескольких сотен до нескольких тысяч элементов.
Требуется немного времени, чтобы заполнить эти,Не долго - всего несколько секунд, но приятно, что пользователь может что-то посмотреть, чтобы он знал, что программа работает в фоновом режиме, пока они ждут.
У меня есть общее "Пожалуйста, подождите"Анимированное верхнее окно без полей, которое появляется, когда это происходит, однако у меня возникают проблемы с анимацией.
Для большинства задач, которые занимают немного времени, я решаю это следующим образом:
Program.ShowPleaseWait(); // Show top-most animation
Thread t = new Thread(stuffToDo); // Run stuffToDo() in separate thread
t.Start();
While (t.IsAlive)
Application.DoEvents(); // Run message queue, necessary for animation
Program.HidePleaseWait(); // Hide top-most animation
и это работает довольно хорошо.Иногда материал в потоке должен вызывать что-то, и это иногда вызывает небольшой сбой в анимации, но обычно это не имеет большого значения.
С этой формой, однако, весь Код в потоке - это код пользовательского интерфейса: заполнение списков и комбинированных списков.Это означает, что все должно быть заключено в блоки Invoke, что не имеет никакого смысла, потому что тогда нет смысла запускать его в отдельном потоке, во-первых.
Кроме удаления всего рабочего потокадля этого конкретного случая и добавляя Application.DoEvents()
каждые сто или около того вставок в каждом цикле, могу ли я что-нибудь сделать, чтобы рабочая анимация продолжалась, пока заполнены элементы управления?