C# 如何显示耗时较长的功能的进度状态?

C# 如何显示耗时较长的功能的进度状态?,c#,windows,winforms,C#,Windows,Winforms,我有一个简单的windows窗体,如下所示:1单击一个按钮将执行一个需要很长时间才能完成的操作,2显示进度百分比的标签 在我提到的长时间操作中,我编写了更新标签文本属性的代码,但它不起作用 请帮助我正确显示进度状态。您可以查看BackgroundWorker类,请参阅。它允许您在后台运行一些长时间运行的操作,并向用户界面报告后台任务的进度更新百分比和完成情况。请注意,您需要自己计算进度百分比 但是,BackgroundWorker类负责处理其他棘手的方面,例如将进度报告发送到主GUI线程,在那里

我有一个简单的windows窗体,如下所示:1单击一个按钮将执行一个需要很长时间才能完成的操作,2显示进度百分比的标签

在我提到的长时间操作中,我编写了更新标签文本属性的代码,但它不起作用


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

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


但是,BackgroundWorker类负责处理其他棘手的方面,例如将进度报告发送到主GUI线程,在那里您可以安全地更新用户界面

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


但是,BackgroundWorker类负责处理其他棘手的方面,例如将进度报告发送到主GUI线程,在那里您可以安全地更新用户界面

您需要创建一个执行任务的工作线程,并偶尔向表单线程报告其更新。如果您在UI线程中完成所有工作,您的UI将被锁定,并且无法正确更新进度/标签

在启动辅助线程之前,请计算您认为该进程将采取的步骤总数。启动辅助线程。在每一个工作单元完成后,您在UI线程上调用一个更新方法来增加进程

您需要查看BackgroundWorker类


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

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

在启动辅助线程之前,请计算您认为该进程将采取的步骤总数。启动辅助线程。在每一个工作单元完成后,您在UI线程上调用一个更新方法来增加进程

您需要查看BackgroundWorker类


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

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

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

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

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

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

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

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


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

您需要向我们展示您编写的一些代码。如何更新函数中的text属性?您需要向我们展示一些您编写的代码。如何更新函数中的文本属性?