2009-06-17 72 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