我有执行网络服务请求的代码。 在执行此请求时,我需要一个进度条才能独立移动。
我的问题是我只需要说每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);
答案 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服务。完成后,关闭“正在工作”对话框。