1

我正在尝试使用 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 最终确实显示“正在恢复数据库”,但直到恢复完成后才显示。有任何想法吗?

4

3 回答 3

2

您正在阻止 GUI 线程,这会阻止它更新。您可以调用 lblStatus.Refresh(),或将您的 Wait 移至后台线程(这最终是正确的做法)。

于 2009-06-17T21:06:18.953 回答
0

这是一个线程问题。您可以在单独的线程或后台线程上执行此操作。我见过人们使用的一种方法是做一个 Application.DoEvents() 虽然我通常远离那个电话。

于 2009-06-17T21:06:07.193 回答
0

在您完成对前台线程的处理并释放它之前,无法对 GUI 进行更新。您需要在后台线程上进行恢复以允许前台线程继续更新 GUI。考虑将恢复代码放在单独的方法中并使用 ThreadPool.QueueUserWorkItem( ),并传递恢复方法。这将在线程池线程上触发您的恢复方法。

如果您需要在线程完成时对线程和通知进行更多控制,您可以使用BackgroundWorker

于 2009-06-17T21:14:31.293 回答