Quiero mostrar el progreso de los cálculos, que se realizan en una biblioteca externa.
Por ejemplo, si tengo algún método de cálculo y quiero usarlo para 100000 valores en mi clase de formulario, puedo escribir:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Caluculate(int i)
{
double pow = Math.Pow(i, i);
}
private void button1_Click(object sender, EventArgs e)
{
progressBar1.Maximum = 100000;
progressBar1.Step = 1;
for(int j = 0; j < 100000; j++)
{
Caluculate(j);
progressBar1.PerformStep();
}
}
}
Debo realizar un paso después de cada cálculo. Pero, ¿qué pasa si realizo todos los 100000 cálculos en un método externo? ¿Cuándo debo "realizar el paso" si no quiero que este método dependa de la barra de progreso? Puedo, por ejemplo, escribir
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void CaluculateAll(System.Windows.Forms.ProgressBar progressBar)
{
progressBar.Maximum = 100000;
progressBar.Step = 1;
for(int j = 0; j < 100000; j++)
{
double pow = Math.Pow(j, j); //Calculation
progressBar.PerformStep();
}
}
private void button1_Click(object sender, EventArgs e)
{
CaluculateAll(progressBar1);
}
}
pero no quiero hacer eso.
c#
winforms
progress-bar
Dmytro
fuente
fuente
Respuestas:
Te sugiero que eches un vistazo a BackgroundWorker . Si tiene un bucle tan grande en su WinForm, se bloqueará y su aplicación parecerá que se ha colgado.
Mire
BackgroundWorker.ReportProgress()
para ver cómo informar el progreso al hilo de la interfaz de usuario.Por ejemplo:
fuente
BackgroundWorker
se agrega a través del diseñador y se configura allí. Pero sí, deberá configurarse para que seWorkerReportsProgress
establezca entrue
.RunWorkerCompleted
controlador de eventos, si tuDoWork
controlador no lo hace ..Desde .NET 4.5, puede usar la combinación de async y esperar con Progress para enviar actualizaciones al hilo de la interfaz de usuario:
Las tareas son actualmente la forma preferida de implementar lo que
BackgroundWorker
hace.fuente
await DoWorkAsync(progress);
? Esto es muy a propósito, ya que eso no daría como resultado la ejecución de un hilo adicional. Solo siDoWorkAsync
se llamara a sí mismo,await
por ejemplo, esperando una operación de E / S, labutton1_Click
función continuaría. El hilo principal de la interfaz de usuario está bloqueado durante este tiempo. SiDoWorkAsync
no es realmente asincrónico, sino muchas declaraciones sincrónicas, no gana nada.Step
solo está disponible en la barra de progreso de WinForms y no es necesario aquí, pero estaba presente en el código de ejemplo de la pregunta (winforms etiquetados), por lo que podría permanecer.Hola, hay un tutorial útil sobre perlas Dot Net: http://www.dotnetperls.com/progressbar
De acuerdo con Peter, necesita usar cierta cantidad de subprocesos o el programa simplemente se bloqueará, frustrando un poco el propósito.
Ejemplo que usa ProgressBar y BackgroundWorker: C #
fuente
Hay
Task
existe, es un uso no comestibleBackgroundWorker
,Task
es más simple. por ejemplo:ProgressDialog.cs:
¡Hecho! Entonces puedes reutilizar ProgressDialog en cualquier lugar:
fuente