2011-05-17 200 views
1

我試圖實現backgroudworker,但是在第二個線程中不起作用,並且表單仍然是loking,e不能調用我的按鈕2的事件,有人告訴我爲什麼發生這種情況?爲什麼我的backgroundWorker不起作用?

我的代碼:

public Form1() 
{ 
    InitializeComponent(); 
    backgroundWorker1.DoWork += 
    new DoWorkEventHandler(backgroundWorker1_DoWork); 
    backgroundWorker1.ProgressChanged += 
    new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); 
    backgroundWorker1.RunWorkerCompleted += 
    new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); 
    backgroundWorker1.WorkerReportsProgress = true; 
} 

void backgroundWorker1_RunWorkerCompleted(object sender, 
    RunWorkerCompletedEventArgs e) 
{ 
    MessageBox.Show("Work is done"); 
} 

void backgroundWorker1_ProgressChanged(object sender, 
    ProgressChangedEventArgs e) 
{ 
    this.progressBar1.Value = e.ProgressPercentage; 
} 

void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    ThreadProc(); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    backgroundWorker1.RunWorkerAsync(); 
} 

void ThreadProc() 
{ 
    //simulate work 
    for (int i = 0; i < 100000; ++i) 
    { 
    int total = i/1000; 
    backgroundWorker1.ReportProgress(total); 
    } 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("Another thread"); 
} 

TKS;

回答

0

對於初學者來說,我可以說,後臺工作將會從ThreadPool分配的另一個線程。儘管如此,仍然可以鎖定您的用戶界面,因爲當您調用ProgressChangedRunWorkerCompleted事件時,它們會被整理回UI線程。只有DoWork事件適用於另一個ThreadPool線程。

如果您是在UI線程上的而不是,那麼您無法訪問UI元素(如按鈕2而無需額外的工作)。要從其他線程訪問UI元素,您需要使用Control.Invoke將回調封送到UI線程。

1

我認爲,因爲你不斷通過讓你的線程報告進度100000次更新UI線程,你的UI線程太佔用接受click事件從按鈕2.我會顯著降低報告的數量,看看是否這有什麼影響。

由於ProgressBar.Value是一個int,這個應該沒有differenece:

for (int i = 0; i < 100; i++) 
    { 
    backgroundWorker1.ReportProgress(i); 
    } 
4

看起來你可以以非常快的速度,這將導致在形式得到鎖定了被報告進展情況回形式。

嘗試改變,像這樣的ThreadProc的方法......僅用於演示目的,當然是:

void ThreadProc() 
{ 
    //simulate work 
    for (int i = 0; i < 100000; ++i) 
    { 
     Thread.Sleep(1); // this should allow the form to breath a little :) 
     int total = i/1000; 
     backgroundWorker1.ReportProgress(total); 
    } 
} 
+0

嗨史蒂夫·迪南,就是這樣,謝謝 – Fernando 2011-05-17 15:10:47