Tengo un problema como este:C# Winform ProgressBar y BackgroundWorker
Tengo un Formulario llamado MainForm. Tengo una operación larga que se llevará a cabo en este formulario.
Mientras se realiza esta operación larga, necesito mostrar otra de ProgressForm con nombre en la parte superior de MainForm.
ProgressForm contiene una barra de progreso. Que necesita actualizarse mientras se lleva a cabo la operación larga.
Una vez completada la operación larga, ProgressForm debe cerrarse automáticamente.
he escrito algo de código como el siguiente:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace ClassLibrary
{
public class MyClass
{
public static string LongOperation()
{
Thread.Sleep(new TimeSpan(0,0,30));
return "HelloWorld";
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace BackgroungWorker__HelloWorld
{
public partial class ProgressForm : Form
{
public ProgressForm()
{
InitializeComponent();
}
public ProgressBar ProgressBar
{
get { return this.progressBar1; }
set { this.progressBar1 = value; }
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ClassLibrary;
namespace BackgroungWorker__HelloWorld
{
public partial class MainForm : Form
{
ProgressForm f = new ProgressForm();
public MainForm()
{
InitializeComponent();
}
int count = 0;
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (f != null)
{
f.ProgressBar.Value = e.ProgressPercentage;
}
++count;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("The task has been cancelled");
}
else if (e.Error != null)
{
MessageBox.Show("Error. Details: " + (e.Error as Exception).ToString());
}
else
{
MessageBox.Show("The task has been completed. Results: " + e.Result.ToString());
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
if (f == null)
{
f = new ProgressForm();
}
f.ShowDialog();
//backgroundWorker1.ReportProgress(100);
MyClass.LongOperation();
f.Close();
}
private void btnStart_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void btnCancel_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
this.Close();
}
}
}
yo no estoy encontrando la manera de actualizar el progressBar.
¿Dónde debo colocar backgroundWorker1.ReportProgress()
y cómo debo llamar esto?
No debo hacer ningún cambio en MyClass. Coz, no sé qué pasaría o cuánto tiempo llevaría completar la operación en esta capa de mi aplicación.
¿Alguien me puede ayudar?
No debo hacer ningún cambio en MyClass. Coz, no sé qué pasaría en esta capa de mi aplicación. – anonymous
Entonces no puede informar el progreso con precisión. Quiero decir que puedes agregar un temporizador al 'ProgressForm' para simplemente incrementar la barra de progreso cada segundo, pero eso solo proporcionará una ilusión. Si no tiene forma de averiguar el progreso * real *, ¿qué tan útil es una barra de progreso? –