我有這樣的問題:C#Winform ProgressBar和BackgroundWorker
我有一個名爲MainForm的窗體。我在這張表格上進行了長時間的操作。
當這個長時間的操作正在進行時,我需要在MainForm的頂部顯示另一個名爲ProgressForm。
ProgressForm包含一個進度條。長期操作發生時需要更新哪些內容。
Long操作完成後,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();
}
}
}
我沒有找到更新進度條的方式。
我應該在哪裏放置backgroundWorker1.ReportProgress()
,我應該怎麼稱呼它?
我不能在MyClass中做任何改變。 Coz,我不知道會發生什麼,或者需要多長時間才能完成我的應用程序的這一層操作。
任何人都可以幫助我嗎?
我不能在MyClass中做任何改變。因爲,我不知道我的應用程序的這一層會發生什麼。 – anonymous 2009-09-24 10:58:59
然後你不能準確地報告進度。我的意思是你可以在ProgressForm中添加一個定時器來每秒增加進度條,但這隻會提供一個幻覺。如果你無法找到真正的進度,那麼進度條有多有用? – 2009-09-24 11:00:45