Вопрос

Я пытаюсь использовать объект Microsoft.SqlServer.Management.Smo.Restore для восстановления базы данных SQL Server 2000. Непосредственно перед началом операции восстановления я изменяю текст метки, чтобы пользователь знал, что происходит. Однако измененный текст не отображается в графическом интерфейсе (т. Е. Текст остается таким же, каким был) до ПОСЛЕ строки fullRestore.Wait ().

lblStatus.Text = "Restoring Database";
Restore fullRestore = new Restore(); 

// Configure fullRestore

fullRestore.SqlRestore(_server);
fullRestore.Wait();

Странно то, что lblStatus в конечном итоге отображает «Восстановление базы данных», но только после после восстановления будет завершено. Есть идеи?

Это было полезно?

Решение

Вы блокируете поток GUI, который не позволяет обновить его. Вы можете вызвать lblStatus.Refresh () или переместить ваш Wait в фоновый поток (что, в конечном счете, является правильным решением).

Другие советы

Это проблема с многопоточностью. Вы можете сделать это в отдельных потоках или в фоновом потоке. Один из подходов, который я видел у людей, - это создание Application.DoEvents (), хотя я обычно избегаю этого вызова.

Обновление графического интерфейса не может произойти, пока вы не закончили обработку в потоке переднего плана и не выпустили его. Вам необходимо выполнить восстановление в фоновом потоке, чтобы позволить приоритетному потоку продолжить обновление графического интерфейса. Попробуйте добавить код восстановления в отдельный метод и использовать ThreadPool .QueueUserWorkItem () и передача метода восстановления. Это вызовет ваш метод восстановления в потоке пула потоков.

Если вам нужен больший контроль над потоком и уведомление о его завершении, вы можете использовать BackgroundWorker

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top