我有一个对员工进行评估的过程,以显示 X 数量的员工的形式处理罢工,用户可以选择他们想要处理的员工。在处理过程中,我必须显示该过程正在进行的进度和百分比。
问题:增加progressBar
了但labelPorcentaje
没有增加,它只在过程结束时显示 100%。要处理的数据量取决于用户选择的员工,因此,有时他们可能很少或很多,无论要处理的数据是否很少,我都希望能够欣赏到过程中的进度增加或许多。
我做了一个简单的例子来代表我的问题:
private void btnEvaluar_Click(object sender, EventArgs e)
{
labelProgreso.Visible = true;
progressBar1.Visible = true;
int progreso = 0, porciento = 0, totalEmpleadosProcesar = 0;
for (int indice = 0; indice < 85; indice++) //Ciclo que representará los empleados seleccionados
{
totalEmpleadosProcesar = 85; //Total de Empleados que seleccionó el usuario
progreso++; //Aumentando el progreso
porciento = Convert.ToInt16(( ( (double)progreso / (double)totalEmpleadosProcesar ) * 100.00 )); //Calculo del porcentaje
reportarProgreso(100, porciento); //función que cargará la barra de progreso
//MessageBox.Show("Porciento: " + porciento);
}
MessageBox.Show("Completo...");
labelProgreso.Visible = false;
progressBar1.Visible = false;
}
加载 ProgressBar 的函数:
private void reportarProgreso(int valorMaximo, int valor)
{
progressBar1.Step = 1;
progressBar1.Style = ProgressBarStyle.Continuous;
progressBar1.Minimum = 0;
progressBar1.Maximum = valorMaximo;
if (valor > valorMaximo)
{
labelProgreso.Text = "100%";
progressBar1.Value = valorMaximo;
}
else
{
labelProgreso.Text = Convert.ToString(valor) + "%";
progressBar1.Value = valor;
}
}
为了修复它,我尝试Thread.Sleep(1000);
在循环遍历期间使用,但它仍然没有显示百分比label
我不想使用 a
Thread.Sleep
,因为正如我所说,如果员工很少,它会运作良好,但如果有很多员工并且我为 Thread 设置了时间,那将需要很多时间。
如果我通过测试干预每个循环交互,MessageBox
它会显示label
.
我究竟做错了什么?代表流程进度的正确方法是什么?
注意:我不在乎界面在此过程中是否仍然处于活动状态,这就是我没有使用Task
或BackGroundWorker
...的原因
环境:Visual Studio 2010 (WindowsForms) & .NET NetFramework 4.0
问题是您的循环阻塞了执行的主线程,从而阻止了重绘标签。为了解决这个问题,我建议使用 BackgroundWorker。
首先,
BackgroundWorker
在您的表单中定义:然后在按钮事件中,设置
ProgressChanged
,DoWork
和事件RunWorkerCompleted
并调用它们的执行:事件
DoWork
(我添加了一个Sleep
以显示进度):ProgressChanged
我们同时更新Progressbar
和 的事件Label
:最后,完成后
RunWorkerCompleted
执行的事件BackgroundWorker
: