2009-06-17 123 views
1

我正在嘗試使用Microsoft.SqlServer.Management.Smo.Restore對象來還原SQL Server 2000數據庫。就在我開始恢復操作之前,我更改了標籤的文本,以便用戶知道發生了什麼。但是,直到fullRestore.Wait()行後面,GUI中才會顯示已更改的文本(即文本保持不變)。Label.Text更改被阻止?

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

// Configure fullRestore 

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

奇怪的是,lblStatus最終不顯示「還原數據庫」 之後,但直到恢復完成。有任何想法嗎?

回答

2

您正在屏蔽GUI線程,阻止它更新。您可以調用lblStatus.Refresh(),或將Wait移至後臺線程(這最終是正確的做法)。

+0

調用lblStatus.Refresh()將沒有任何區別,都認爲確實是控制無效,因此會重新繪製,直到GUI線程可用時,實際的重繪仍然不可能發生。 – 2009-06-17 21:10:11

0

這是一個線程問題。您可以在單獨的線程或後臺線程上執行此操作。我見過的一種方法是使用Application.DoEvents(),儘管我通常遠離該調用。

0

在前臺線程完成處理並釋放它之前,不會對GUI進行更新。您需要在後臺線程上執行恢復,以允許前臺線程繼續更新GUI。考慮將恢復代碼放入單獨的方法中,並使用ThreadPool.QueueUserWorkItem()並傳遞恢復方法。這將觸發線程池線程上的還原方法。

如果您需要在線程和通知更多的控制,當它已經完成,你可以使用一個BackgroundWorker