2013-03-01 71 views
2

如何在C#中使用BackgroundWorker?如何在C#中使用BackgroundWorker#

其實我正在執行填充PDF-Form的方法,名爲fill()。它需要更多的時間來顯示結果爲PDF查看器,所以我決定顯示了「處理圖像」使用BackgroundWorker的,並試圖使用它,但未能實現它

這裏是我的代碼片段:

 private void bgwLoadFile_DoWork(object sender, DoWorkEventArgs e) 
     { 
      this.Invoke((MethodInvoker)delegate() 
      { 
       ???? 
      }); 
     } 

     private void bgwLoadFile_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      if (e.Cancelled == true) 
      { 
      } 
      else if (e.Error != null) 
      { 
      } 
      else 
      { 
      picLoading.SendToBack(); 
      } 
     } 
當按鈕 FILL是被點擊

private void btnFill_Click(object sender, EventArgs e) 
     { 
      if (btnFill.Text == "Fill") 
      { 
       bgwLoadFile.RunWorkerAsync(); 
       picloading.BringToFront(); 

       Fill(); 
      } 

笏的說法應該我需要在DoWork的方法添加

填充方法被調用,如果我嘗試添加FILL()的填充物被稱爲兩次...

任何一個可以幫助我

感謝

回答

2

所以讓我們嘗試找到一些答案:

方法worker_DoWork()將另一個線程中執行。通過在該方法中調用this.Invoke(),您將把該調用回傳給gui線程,這使得後臺工作者的使用毫無用處。相反,在工人方法中,您必須調用需要一些時間的方法,並且不與gui進行交互。如果這個被調用的方法產生任何結果(例如返回值),你應該把這些信息寫入變量e.Result

方法worker_RunWorkerCompleted()將再次在gui線程中調用。讓你得到結果,並讓它與gui進行交互。由於這個事實,這個方法將在gui線程上執行,所以它應該非常簡單(或者快速),否則你的gui會再次凍結。

所以考慮到這些信息可以清理你的代碼:

private void btnFill_Click(object sender, EventArgs e) 
{ 
    if (btnFill.Text == "Fill") 
    { 
     // Update the gui for the user 
     // and start our long running task 
     // (disable buttons etc, cause the 
     // user is still able to click them!). 
     picloading.BringToFront(); 
     bgwLoadFile.RunWorkerAsync(); 
    } 
} 

private void bgwLoadFile_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // Let's call the long running task 
    // and wait for it's finish. 
    Fill(); 
} 

private void bgwLoadFile_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // We're back in gui thread. 
    // So let us show some results to the user. 
    if (e.Cancelled) 
    { 
     // To support cancellation, the long running 
     // method has to check some kind of cancel 
     // flag (boolean field) to allow fast exit of it. 
     labelMessage.Text = "Operation was cancelled."; 
    } 
    else if (e.Error != null) 
    { 
     labelMessage.Text = e.Error.Message; 
    } 

    // Hide the picture to allow the user 
    // to access the gui again. 
    // (re-enable buttons again, etc.) 
    picLoading.SendToBack(); 
} 
5

添加Fill();bgwLoadFile_DoWorkbtnFill_Click

刪除它只是一個側面說明,你可能會想打電話給你picLoading.SendToBack();外面的那'其他',如果你錯誤或取消它會留在那裏。

相關問題