2013-10-25 26 views
1

我有簡單的winforms應用程序,我有按鈕。按鈕點擊我正在做這樣的爲什麼主線程在執行後臺工作時被掛起

private void Button1_Click(object sender, EventArgs e) 
    { 
     BackgroundWorker bw_Convert = new BackgroundWorker(); 
     bw_Convert.WorkerReportsProgress = true; 
     bw_Convert.DoWork += bw_Convert_DoWork; 
     bw_Convert.RunWorkerCompleted += bw_Convert_RunWorkerCompleted; 
     bw_Convert.ProgressChanged += bw_Convert_ProgressChanged; 
     bw_Convert.WorkerReportsProgress = true; 
     bw_Convert.RunWorkerAsync(); 
    } 

的東西我有以下的後臺工作

public void bw_Convert_DoWork(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 0; i <= 1000000; i++) 
     {     
      bw_Convert.ReportProgress((100 * (i)/1000)); 
     } 
    } 
    public void bw_Convert_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    {   

     progressBarControl1.EditValue = e.ProgressPercentage.ToString(); 
    } 

代碼通過這樣做。爲什麼我的主線程被掛起,因爲我正在處理背景工作者的事情。

+1

你怎麼能知道主線被絞死? – Kangkan

回答

2

由於ReportProgress事件處理程序上主線程執行:

到ReportProgress方法的調用是異步的,並立即返回 。 ProgressChanged事件處理程序在創建BackgroundWorker的線程 上執行。

因此,您不斷地從後臺線程調用ReportProgress,它使您的主線程不斷忙於處理此事件。

如果你有很多快速的工作在做背景,然後嘗試報告,而不是在每次迭代提高事件僅在每個第n次迭代:

public void bw_Convert_DoWork(object sender, DoWorkEventArgs e) 
{ 
    for (int i = 0; i <= 1000000; i++) 
    { 
     if (i % 10000 == 0) 
      bw_Convert.ReportProgress(i); 
     // do something 
    } 
} 
1

是在UI上執行的ProgressChanged事件線程,以便您可以訪問控件。
後臺工作程序中的代碼在很短的時間內執行,導致許多事件在短時間內引發,使得代碼反應就好像它將在UI線程上完全執行一樣。

實際上,大部分工作都是在UI線程中完成的,因爲更新屏幕上的控件比循環迭代更有效。

相關問題