【发布时间】:2014-12-18 08:58:34
【问题描述】:
我已尝试(但失败)从 WPF 应用程序进行异步 Web 服务调用。
我在我的代码中实现了一个BackgroundWorker,当您按下我的 GUI 上的“发送”按钮时,它应该可以完成工作。 有时它会做它应该做的事情,但最终它实际上并没有异步运行。
当您在我的 GUI 中按下按钮时,会触发以下代码:
private void btnSend_Click(object sender, RoutedEventArgs e)
{
sQuantity = boxQuantity.Text;
progressBar.Maximum = double.Parse(sQuantity);
worker.RunWorkerAsync();
}
sQuantity 只是一个盒子,里面有一个数字。它将确定您一次向 Web 服务发送多少请求。
progressBar 是您所期望的:进度条。
worker.RunWorkerAsync() 是我调用DoWork 方法的地方。它看起来像这样:
void worker_DoWork(object sender, DoWorkEventArgs e)
{
EnableButton(false);
List<LoanRequestNoCreditScoreDTO> dtoList = GetData();
foreach (LoanRequestNoCreditScoreDTO dto in dtoList)
{
using (LoanBrokerWS.LoanBrokerWSClient client = new LoanBrokerWS.LoanBrokerWSClient())
{
try
{
Task<LoanQuoteDTO> lq = RequestQuote(dto, client);
LoanQuoteDTO response = lq.Result;
lq.Dispose();
String responseMsg = response.SSN + "\n" + response.interestRate + "\n" + response.BankName + "\n------\n";
AppendText(responseMsg);
worker_ProgressChanged();
}
catch (Exception ex)
{
AppendText(ex.Message + "\n" + ex.InnerException.Message + "\n");
worker_ProgressChanged();
}
}
}
EnableButton(true);
}
最终,这当然是我搞砸的地方。我希望应用程序发送与用户指定的请求一样多的请求。所以如果我写 10 个数量,我会发送 10 个请求。 RequestQuote() 方法调用如下代码:
private async Task<LoanQuoteDTO> RequestQuote(LoanRequestNoCreditScoreDTO dto, LoanBrokerWS.LoanBrokerWSClient client)
{
LoanQuoteDTO response = await client.GetLoanQuoteAsync(dto.SSN, dto.LoanAmount, dto.LoanDuration);
return response;
}
如何让DoWork 方法真正异步发送请求?
【问题讨论】:
-
异步运行;您正在寻找的是并发执行。
标签: c# wpf web-services asynchronous