2

在我的 c# winform 应用程序中,我有一个按钮,单击该按钮时,它会执行一些可能需要一些时间的计算。

我也有一个label.visible = false我想label.visible = true在单击按钮后立即执行的操作,以便用户可以看到该应用程序正在运行。

事情是,即使label.visible = true是方法中的第一件事button1_Click(object sender, EventArgs e),它也只会在执行计算后在最后切换到可见。

如何在 button_click 之后立即显示标签?

4

4 回答 4

4

如果您需要应用程序在处理应用程序时保持响应,请查看Background Worker

您可以通过以下方式强制您的表单更新和处理任何后台消息:

Application.DoEvents();

就在您更改标签之后 - 尽管这可能是一个有点骇人听闻的解决方案。

于 2013-01-07T14:18:54.117 回答
2

您的计算正在 UI 线程上执行。这意味着在您设置标签的可见性后,它会阻止 UI 刷新。您应该考虑使用任务在另一个线程上进行计算。这将允许 UI 在看似可以在后台运行的长时间操作期间做出响应。

例如

var taskCalc = Task.Factory.StartNew(() => //Do Calculation );
于 2013-01-07T14:20:12.810 回答
1

有几种方法可以解决这个问题。

一种方法(最简单的)是调用

this.Refresh();

在您将标签设置为可见之后。

另一种是在后台线程中进行计算。最简单的方法是使用BackgroundWorker. 然后,您的主线程可以在后台工作线程执行计算的同时继续为 UI 提供服务(刷新表单、响应按钮等)。

有关后台工作线程的更多信息,请参见http://www.dotnetperls.com/backgroundworker

于 2013-01-07T14:21:00.133 回答
1

就像其他人所说:您正在 UI 线程上执行您的工作。我正在向您展示另一种实现您需要的有效方法。您可以使用匿名委托将您的工作移至单独的线程。

(new System.Threading.Thread(() =>
        {
            dowork(); // What ever work you need put here.
        })).Start();
于 2013-01-07T14:54:32.837 回答