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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top