winforms - 使用 ProgressBar 作为等待栏 - 如何避免卡住?

标签 winforms multithreading progress-bar backgroundworker

我正在创建一个自定义图表控件,我希望能够在其他命令运行时(即正在创建图表)显示某种等待栏。

我使用 ProgressBar (选取框模式下的 System.Windows.Forms.ProgressBar)作为此控件的一部分。我不需要更新进度条的状态,我只是希望它一遍又一遍地移动,直到创建图表。

现在我在以下方案中使用它:
- 启动等待栏(ProgressBar 出现并开始运行)
- 调用图表方法
- 当图表准备好时,等待栏将被隐藏。

问题是:某些图表方法确实需要大量计算,并且等待栏在这种情况下会卡住。我怎样才能避免这些卡住?我应该使用某种线程/后台 worker 吗?如果是,那么最简单的方法是什么?

请注意,在准备图表时我不需要更改进度条的状态。我只需要等待栏启动,在所有计算期间运行并在此之后停止。

编辑

好的,按照建议,我为这些要求较高的计算创建了一个单独的线程,以避免卡住。

但是如何等待线程完成而不卡住 GUI?

我按照建议尝试了 here ,类似这样的东西:

Thread t = new Thread( () => { DoSomeLongAndDemandingTask(withParameters); });
t.Start();
t.Join()

// do something that needs to be done after thread finishes
InvokeMeAfterThreadFinished();

但是它卡住了 GUI。还有其他方法可以避免这些卡住吗?

最佳答案

您已经回答了自己的问题 - 通常答案是将计算移至后台线程。有一个名为“BackgroundWorker”的 WinForms 组件,可以为您完成大量工作:

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx http://dotnetperls.com/backgroundworker

请注意,您将无法从后台线程访问 UI 组件,您需要 Control.Invoke 到 UI 线程才能访问 UI 控件。这在网上被广泛讨论(并提供了解决方案),因此谷歌搜索将很容易做到这一点。

或者,有时后台线程无法工作(不知道为什么),因此您可以使用 Application.DoEvents() - 如果内存可用,这会处理消息队列上的待处理消息(包括控制绘制) ,UI更新)。如果您只做了一些导致抖动的工作,这可能是一个更快、更简单的选择 - 尽管不经常建议。

关于winforms - 使用 ProgressBar 作为等待栏 - 如何避免卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3282182/

相关文章:

c# - 当鼠标移动时连续获取鼠标坐标

c# winform 在运行时检查对象

java - 将 JSON 文件读入集合,最佳实践

windows - 线程是否在其整个生命周期中都在同一个 CPU/内核上运行?

php - 简单的跨浏览器,带进度条的 jQuery/PHP 文件上传

vb.net - 如何识别用户是否单击了 DateTimePicker 日历中的日期

c# - 根据系统状态以不同方式处理控制事件

java - Android:Hashmap并发修改异常

java - 将 SWT 进度条切换为不确定(替换小部件)

javascript 在进行冗长的 javascript 计算时显示进度条?