Label.Text 更改被阻止?

发布于 2024-07-24 09:17:15 字数 424 浏览 5 评论 0原文

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

I am attempting to use a Microsoft.SqlServer.Management.Smo.Restore object to restore a SQL Server 2000 database. Just before I begin the restore operation, I change the text of a label so that the user knows what is going on. However, the changed text isn't visible on the GUI (i.e., the text remains the same as it was) until AFTER the fullRestore.Wait() line.

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

// Configure fullRestore

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

The weird thing is, lblStatus eventually does display "Restoring Database", but not until after the restore is complete. Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

蓬勃野心 2024-07-31 09:17:15

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

You're blocking on the GUI thread, which is preventing it from updating. You can call lblStatus.Refresh(), or move your Wait to a background thread (which is ultimately the right thing to do).

沩ん囻菔务 2024-07-31 09:17:15

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

It's a threading issue. You can do this on seperate threads or on a background thread. One approach I've seen people use is do a Application.DoEvents() although I typically stay away from that call.

热风软妹 2024-07-31 09:17:15

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

如果您需要对线程和完成时的通知进行更多控制,可以使用 后台工作人员

The update to the GUI cannot occur until you have finished processing on the foreground thread and released it. You need to do the restore on a background thread to allow the foreground thread to continue updating the GUI. Consider putting the restore code in a separate method and using ThreadPool.QueueUserWorkItem( ), and passing the restore method. This will trigger your restore method on a thread pool thread.

If you need more control over the thread and notification when it has finished, you can use a BackgroundWorker

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文