我正在尝试使用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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top