Rei*_*rce 3 .net c# multithreading backgroundworker progress-bar
在C#,windows窗体中创建.net应用程序.如何在100循环循环的每个循环中更新进度条1步?(我正在处理循环中的excel表.)进度条控件位于UI类中,该类连接到连接到自定义类(MVC模式)的控制器类.循环在自定义类中.我是否需要在每种方法中一直向下发送UI类实例,还是有更好的方法?
现在,循环结束后进度条会更新.Application.doevents和.update或.refresh不起作用.
说下面是你的类负责在其中进行循环的工作.添加事件以指示您的进度.然后从您的UI中简单地处理该事件并相应地更新进度条.
sealed class Looper
{
public event EventHandler ProgressUpdated;
private int _progress;
public int Progress
{
get { return _progress; }
private set
{
_progress = value;
OnProgressUpdated();
}
}
public void DoLoop()
{
_progress = 0;
for (int i = 0; i < 100; ++i)
{
Thread.Sleep(100);
Progress = i;
}
}
private void OnProgressUpdated()
{
EventHandler handler = ProgressUpdated;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以通过BackgroundWorker将UI作为UI的一部分来实现,在backgroundWorker.DoWork您调用的情况下looper.DoLoop().然后在您的looper.ProgressUpdated事件处理程序中,您可以调用backgroundWorker.ReportProgress以从UI线程增加进度条.
请注意,将进度本身包含在您的ProgressUpdated事件所包含的信息中可能更有意义(我只是想写出一个新的类来源于EventArgs说明这一点;无论如何你可能得到了图片).
另请注意,除非您在UI线程的单独线程上使用循环执行代码,否则上述操作确实没有意义.否则,您的所有工作都会在下一次UI刷新之前完成,因此您的进度条将不会提供任何值(当循环完成时,它将从0到100).
这是一个如何实现这种事情的例子.
| 归档时间: |
|
| 查看次数: |
4200 次 |
| 最近记录: |