2010-03-28 27 views
1

我有一个窗体形式就像这样:1)点击按钮将执行一个需要很长时间才能完成的操作,2)显示正在进行多少百分比的标签。如何显示长时间使用功能的进度状态?

在我提到的长操作中,我编写代码来更新标签的Text属性,但它不起作用!

请帮我正确显示进度状态。

+1

你需要向我们展示你写的一些代码。你如何更新函数中的文本属性? – 2010-03-28 14:01:55

回答

4

您可以查看BackgroundWorker类(请参阅MSDN overview)。它允许您在后台运行一些长时间运行的操作并报告进度更新(百分比)以及从后台任务到用户界面的完成情况。请注意,您需要自己计算进度百分比。

然而,BackgroundWorker类负责其他棘手的方面,例如将进度报告发送到主GUI线程(您可以安全地更新用户界面)。

2

您将要创建一个执行任务的工作线程,并偶尔将其更新报告给窗体线程。如果您在UI线程中完成所有工作,则您的UI将被锁定,并且不会正确更新进度/标签。

在启动工作线程之前,请计算您认为该进程需要执行的总步骤数。启动工作线程。在每个工作单元之后,您在UI线程上调用更新方法来增加进程。

你会想看看BackgroundWorker类。

如果您的应用程序将具有其中几个,我建议创建一个过程接口(例如IProgressProcess)。该接口将包含执行过程和报告更新的方法。您将通过从此界面实施来创建所有流程类。编写一个包含进度条并通过构造函数或属性接受IProgressProcess的控件。然后,它可以使用您的自定义流程执行并沿着进度条移动。然后,您可以让您的自定义进度控制在流程完成或取消时发送事件。

1

如果您尝试在发生操作的同一线程上更新UI,通常会发生这种情况。有几种不同的方法可以实现这一点。

  1. 您可以使用BeginInvoke方法更新UI。可以使用BackgroundWorker组件。
1

您没有看到任何更改的原因是该更改会导致消息重新绘制标签,但主线程正忙于工作,因此它不响应该消息。

最简单的解决方案是在更新标签后调用Application.DoEvents。这可以快速解决您的紧急问题,但它仍然会以其他任何方式使应用程序无响应。

好的解决方案是在单独的线程中开始操作。这样,您的主线程可以在操作运行时自由处理消息。然而,在单独的线程中工作意味着在与UI进行通信时需要更多的工作。如果要更新控件,则必须使用Invoke方法来启动在主线程中运行的方法,以便它可以访问控件。或者,您可以更新线程中的变量,并拥有一个定时器控件,用于定期检查变量中的更改并相应地更新标签。

相关问题