BackgroundWorker需要帮助

时间:2010-04-07 09:09:18

标签: c# 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);

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

创建BackgroundWorker(调用实例“bgw”)并键入“bgw.DoWork + =”,然后输入TAB TAB。然后Visual Studio生成DoWork事件处理程序方法。将上面的代码复制到处理程序中,然后瞧。

我认为报告进度没有意义,因为您的进度取决于您没有影响的Web服务请求的持续时间(并且您无法将其分解为较小的任务)。因此,只需显示“正在工作”对话框并启动后台任务即可调用Web服务。完成后,关闭“正在工作”对话框。