2010-04-07 32 views
1

我有一些代碼,做一個Web服務請求。 在做這個請求時,我需要一個進度條獨立移動。BackgroundWorker的幫助需要

我的問題是,我只需要說運行進度更新的每1或2秒,並檢查是否請求的進度已經完成。

NetBasisServicesSoapClient client = new NetBasisServicesSoapClient(); 
      TransactionDetails[] transactions = new TransactionDetails[dataGridView1.Rows.Count - 1]; 
      for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) 
      { 
       transactions[i] = new TransactionDetails(); 
       transactions[i].TransactionDate = (string)dataGridView1.Rows[i].Cells[2].Value; 
       transactions[i].TransactionType = (string)dataGridView1.Rows[i].Cells[3].Value; 
       transactions[i].Shares = (string)dataGridView1.Rows[i].Cells[4].Value; 
       transactions[i].Pershare = (string)dataGridView1.Rows[i].Cells[5].Value; 
       transactions[i].TotalAmount = (string)dataGridView1.Rows[i].Cells[6].Value; 
      } 
      CostbasisResult result = client.Costbasis(dataGridView1.Rows[0].Cells[0].Value.ToString(), dataGridView1.Rows[0].Cells[1].Value.ToString(), transactions, false, "", "", "FIFO", true); 
      string result1 = ConvertStringArrayToString(result.Details); 
+3

問題是什麼? – leppie 2010-04-07 09:10:22

+0

我真的很困惑與背景工作者。獲取相互矛盾的報告。 我不知道如何將上面的代碼包裝到doWork事件中。 – 2010-04-07 09:25:36

回答

4

我使用背景工人所有的時間,他們都是偉大的處理很長一段時間的行動。

從您的代碼

#region Background Work of My Request 

    private void ProcessMyRequest() 
    {    
     if (!bkgWorkerMyRequest.IsBusy) 
     { 
      lblMessageToUser.Text = "Processing Request..."; 
      btnProcessRequest.Enabled = false; 
      bkgWorkerMyRequest.RunWorkerAsync(); 
     } 
    } 
    private void bkgWorkerMyRequest_DoWork(object sender, DoWorkEventArgs e) 
    { 
     // let's process what we need in a diferrent thread than the UI thread 
     string r = GetStuffDone(); 
     e.Result = r; 
    } 
    private void bkgWorkerMyRequest_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     string myResult = (String)e.Result;  

     lblMessageToUser.Text = myResult; 
     btnProcessRequest.Enabled = true; 
    } 

#endregion 

    private function string GetStuffDone() 
    { 
     NetBasisServicesSoapClient client = new NetBasisServicesSoapClient(); 
     TransactionDetails[] transactions = new TransactionDetails[dataGridView1.Rows.Count - 1]; 
     for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) 
     { 
      transactions[i] = new TransactionDetails(); 
      transactions[i].TransactionDate = (string)dataGridView1.Rows[i].Cells[2].Value; 
      transactions[i].TransactionType = (string)dataGridView1.Rows[i].Cells[3].Value; 
      transactions[i].Shares = (string)dataGridView1.Rows[i].Cells[4].Value; 
      transactions[i].Pershare = (string)dataGridView1.Rows[i].Cells[5].Value; 
      transactions[i].TotalAmount = (string)dataGridView1.Rows[i].Cells[6].Value; 
     } 
     CostbasisResult result = client.Costbasis(dataGridView1.Rows[0].Cells[0].Value.ToString(), dataGridView1.Rows[0].Cells[1].Value.ToString(), transactions, false, "", "", "FIFO", true); 
     return ConvertStringArrayToString(result.Details); 
    } 

所有你需要做的是調用方法:

ProcessMyRequest(); 

,它會做的工作。 如果你需要讓主線程需要注意的進步,則可以使用ProgressChanged事件

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

bkgWorkerMyRequest_DoWork方法,你需要更改代碼有

//reports a percentage between 0 and 100 
bkgWorkerMyRequest.ReportProgress(i * 10); 

記住:

alt text http://www.balexandre.com/temp/2010-04-07_1200.png

但是您嘗試調試方法GetStuffDone因爲它是有點難以調試多線程應用

所以,我要做的就是,調試一切,而不需要工人,然後應用工人時會被卡住。

工作得很好,讓我知道,如果你需要有這方面的更多幫助。


添加

我沒有意識到,你得到的工人網格,對不起,對於這一點,只是給電網作爲一個參數,並使用它,請修改:

bkgWorkerMyRequest.RunWorkerAsync(dataGridView1); 

string r = GetStuffDone((GridView)e.Argument); 

private function string GetStuffDone(GridView dataGridView1) 
+0

2件事: 爲了得到進度條,你有 //報告0到100之間的百分比012kgbkgWorkerMyRequest.ReportProgress(i * 10); 裏面_DoWork ..但是我從哪裏來? #2。錯誤對象引用對於您需要設置該整數的非靜態字段,方法或屬性'SOAP_Client_Networth.Form1.dataGridView1' – 2010-04-07 10:13:14

+0

需要,它是您負責告訴所完成的工作的進度,.NET不知道... * 10只是爲了明確地記住你的百分比。您無法訪問其他線程對象,您需要使用安全線程調用。唯一可以訪問主線程對象的地方是RunWorkerCompleted。但這是另一個問題吧? ;-) – balexandre 2010-04-07 10:39:02

+0

現在編譯。 但是,當我運行它時出現此錯誤。 此BackgroundWorker指出它不報告進度。修改WorkerReportsProgress以聲明它報告進度。 – 2010-04-07 10:44:50

0

創建一個BackgroundWorker(調用實例「bgw」),然後鍵入「bgw.DoWork + =」,接着是TAB TAB。 Visual Studio然後生成DoWork事件處理程序方法。將上面的代碼複製到處理程序中,然後瞧。

我不認爲這是有道理的,你報告進度,因爲你的進步是通過在,你有沒有影響(你不能將其分解成更小的任務)Web服務請求的持續時間來確定。因此,只需顯示「正在工作」對話框並啓動後臺任務即可調用Web服務。完成後,關閉「做功」對話框。