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
BackgroundWorkerse agrega a través del diseñador y se configura allí. Pero sí, deberá configurarse para que seWorkerReportsProgressestablezca entrue.RunWorkerCompletedcontrolador de eventos, si tuDoWorkcontrolador 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
BackgroundWorkerhace.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 siDoWorkAsyncse llamara a sí mismo,awaitpor ejemplo, esperando una operación de E / S, labutton1_Clickfunción continuaría. El hilo principal de la interfaz de usuario está bloqueado durante este tiempo. SiDoWorkAsyncno es realmente asincrónico, sino muchas declaraciones sincrónicas, no gana nada.Stepsolo 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
Taskexiste, es un uso no comestibleBackgroundWorker,Taskes más simple. por ejemplo:ProgressDialog.cs:
¡Hecho! Entonces puedes reutilizar ProgressDialog en cualquier lugar:
fuente