Label.Text Change sendo bloqueado?
-
06-07-2019 - |
Pergunta
Estou tentando usar um objeto Microsoft.SQLServer.management.smo.restore para restaurar um banco de dados SQL Server 2000. Pouco antes de começar a operação de restauração, altero o texto de um rótulo para que o usuário saiba o que está acontecendo. No entanto, o texto alterado não é visível na GUI (ou seja, o texto permanece o mesmo que era) até a linha Fullrestore.wait ().
lblStatus.Text = "Restoring Database";
Restore fullRestore = new Restore();
// Configure fullRestore
fullRestore.SqlRestore(_server);
fullRestore.Wait();
O estranho é que Lblstatus acaba exibindo "Restaurando o banco de dados", mas não até depois a restauração está completa. Alguma ideia?
Solução
Você está bloqueando o thread da GUI, que está impedindo que ele seja atualizado. Você pode ligar para lblstatus.refresh () ou mover sua espera para um encadeamento de segundo plano (que é a coisa certa a fazer).
Outras dicas
É uma questão de encadeamento. Você pode fazer isso em threads separados ou em um thread de segundo plano. Uma abordagem que eu vi as pessoas usarem é fazer um aplicativo.DoEvents () Embora eu normalmente fique longe dessa chamada.
A atualização da GUI não pode ocorrer até que você termine de processamento no encadeamento de primeiro plano e o lançasse. Você precisa fazer a restauração em um encadeamento de segundo plano para permitir que o thread de primeiro plano continue atualizando a GUI. Considere colocar o código de restauração em um método separado e usar Threadpool.queueUserworkItem (), e passando o método de restauração. Isso acionará seu método de restauração em um encadeamento de threads.
Se você precisar de mais controle sobre o segmento e notificação quando ele terminar, você pode usar um BackgroundWorker