2010-04-07 75 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服务。完成后,关闭“做功”对话框。