我有一種稱爲Sorter的窗體。有它的按鈕「jademy」的窗口打開「進度窗口」BackgroundWorker不會停止在CancelAsync()並且只能運行一次
private void jademy_Click(object sender, EventArgs e)
{
ProgressWindow progress = new ProgressWindow();
progress.ShowDialog();
}
守則「進度窗口」形式如下:
public partial class ProgressWindow : Form
{
private BackgroundWorker backgroundWorker = new BackgroundWorker();
public ProgressWindow()
{
InitializeComponent();
stop.Visible = true;
ok.Visible = false;
backgroundWorker.RunWorkerAsync();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.WorkerSupportsCancellation = true;
#region block1
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
#endregion
}
private void stop_Click(object sender, EventArgs e)
{
backgroundWorker.CancelAsync();
}
private void ok_Click(object sender, EventArgs e)
{
this.Close();
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 100; i++)
{
Thread.Sleep(100);
backgroundWorker.ReportProgress(i);
}
}
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
this.Text = "Done: " + e.ProgressPercentage.ToString() + "%";
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if ((e.Cancelled == true))
{
MessageBox.Show("Cancelled", "Message", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);
}
else if (!(e.Error == null))
{
MessageBox.Show("Error: " + e.Error.Message, "ERROR!", MessageBoxButtons.OKCancel);
}
else
{
ok.Visible = true;
stop.Visible = false;
}
}
}
現在。我有三個問題。
點擊停止按鈕什麼都不做。看起來'backgroundWorker.CancelAsync()'不會停止這個過程。
當我關閉進度窗口,我想再次運行它,我必須等待一段時間,然後點擊'jademy'按鈕。否則,進度窗口顯示如下: (並且沒有任何更改),而不是:它看起來像程序「記得」,即使它是ProgressWindow的新實例,也完成了工作。請注意,對於不正確的版本,「確定」按鈕可立即顯示 - 而不是等待工作完成。
我想澄清「塊1」中的代碼。說實話我完全不明白。這部分真的很重要嗎?我的意思是,我找到了很多例子(也在這個論壇上 - 例如here),其中沒有包括這部分,用戶報告說該解決方案有效。就我而言,如果沒有這個部分,進度條根本就不起作用,但也許我做錯了什麼。
http://stackoverflow.com/questions/800767/how-to-kill-background-worker-completely –
thread.Abort();鏈接:http://go4answers.webhost4life.com/Example/stop-background-worker-thread-while-86759.aspx –