У меня есть проблема:C# Winform ProgressBar и BackgroundWorker
У меня есть форма с именем MainForm. У меня есть длинная операция, которая должна состояться в этой форме.
Пока эта длинная операция продолжается, мне нужно показать другую с именем ProgressForm поверх MainForm.
ProgressForm содержит индикатор выполнения. Который необходимо обновить во время длительной операции.
По завершении длинной операции функция ProgressForm должна быть автоматически закрыта.
Я написал код, как следующее:
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();
}
}
}
Я не находя способ обновить ProgressBar.
Где я могу разместить backgroundWorker1.ReportProgress()
и как это можно назвать?
Я не должен вносить изменения в MyClass. Coz, я не знаю, что произойдет или сколько времени потребуется для завершения операции в этом слое моего приложения.
Может ли кто-нибудь мне помочь?
Я не должен вносить изменения в MyClass. Coz, я не знаю, что произойдет в этом слое моего приложения. – anonymous
Тогда вы не можете точно сообщить о прогрессе. Я имею в виду, что вы можете добавить таймер в 'ProgressForm', чтобы просто увеличивать индикатор выполнения каждую секунду, но это будет только иллюзией. Если у вас нет никакого способа узнать * фактический * прогресс, то насколько полезен индикатор выполнения? –