Label.Text更改被阻止?
-
06-07-2019 - |
题
我正在尝试使用Microsoft.SqlServer.Management.Smo.Restore对象来还原SQL Server 2000数据库。在我开始还原操作之前,我更改了标签的文本,以便用户知道发生了什么。但是,更改的文本在GUI上不可见(即,文本保持原样),直到fullRestore.Wait()行之后。
lblStatus.Text = "Restoring Database";
Restore fullRestore = new Restore();
// Configure fullRestore
fullRestore.SqlRestore(_server);
fullRestore.Wait();
奇怪的是,lblStatus最终会显示“还原数据库”,但直到在还原完成后才会显示。有什么想法吗?
解决方案
你在GUI线程上阻塞,这阻止了它的更新。你可以调用lblStatus.Refresh(),或者将你的Wait转移到后台线程(这最终是正确的)。
其他提示
这是一个线程问题。您可以在单独的线程或后台线程上执行此操作。我见过人们使用的一种方法是执行Application.DoEvents(),尽管我通常远离该调用。
在完成对前台线程的处理并释放它之前,不会对GUI进行更新。您需要在后台线程上执行还原以允许前台线程继续更新GUI。考虑将恢复代码放在一个单独的方法中并使用 ThreadPool .QueueUserWorkItem(),并传递还原方法。这将在线程池线程上触发恢复方法。
如果你需要更多的控制线程和通知,你可以使用 BackgroundWorker
不隶属于 StackOverflow