編輯:我通過在代碼中創建後臺工作器來解決問題,而不是在設計中拖放。Background Worker問題
現在我知道如何使用後臺工作。
問題
這是使用BGWorker我的第一次,所以這是我的問題......
- 光標不會更改爲「等待」。
- 進度條不更新。
- RunWorkerCompleted未被調用。
但文本框確實更新。
我做錯了什麼?
守則
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace BGWorker
{
public partial class Main : Form
{
public Main()
{
InitializeComponent();
progressBar1.Minimum = 0;
progressBar1.Value = 0;
progressBar1.Maximum = 100;
}
private void button1_Click(object sender, EventArgs e)
{
Cursor.Current = Cursors.WaitCursor;
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 100; i++)
{
textBox1.AppendText(i.ToString());
textBox1.AppendText("\n");
backgroundWorker1.ReportProgress(i);
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
label1.Text = e.Error.Message;
}
else
{
label1.Text = "All Done !";
Cursor.Current = Cursors.Default;
}
}
}
}
感謝。
1)**不要**從'DoWork'事件訪問UI元素。這個「規則」是很好的理由,即使這個特殊情況「有效」:-) 2)連接事件的代碼在哪裏? – 2011-09-15 04:06:10
對不起,我忘了(1)...我沒有訪問我的原始項目中的任何用戶界面。 關於(2),我的代碼不會工作,還需要什麼? – vs2010noob
確保事件已連線。 VS生成器會將所有代碼放入分部類的'InitializeComponent'方法中 - 它可以手動檢查(以及相關部分copy'n'paasted for「proof」:-),儘管它也應該在UI設計器事件屬性。 – 2011-09-15 05:37:17