《亮剑 .Net》——实现异步调用Web Services
普通在调用WebService的时候,程序会等待Web Service执行成功之后才执行接下来的逻辑,这样有可能会造成客户端UI线程的阻塞假死现象,这个时候可以使用异步调用Web Service的办法解决这个问题。
第一种方法:
通过利用Backgroundworker对象实现,Backgroundworker类允许你在单独的专用线程上运行操作。
private void button1_Click(object sender, EventArgs e)
{
BackgroundWorker backgroundworker = new BackgroundWorker();
// 注册具体异步处理的方法
backgroundworker.DoWork += new DoWorkEventHandler(back_DoWork);
// 注册调用完成后的回调方法
backgroundworker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(back_RunWorkerCompleted);
// 这里开始异步调用
backgroundworker.RunWorkerAsync();
//调用服务的同时客户端处理并不停止
ChangeProcessBar();
}
//完成事件
void back_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
throw e.Error;
progressBar1.Value = progressBar1.Maximum; //调用完成了,把客户端进度条填充满
string price = e.Result.ToString(); //获取处理结果
MessageBox.Show("调用完成。价格是:" + price); //显示从服务器获取的结果值
}
//调用方法
void back_DoWork(object sender, DoWorkEventArgs e)
{
//Web Service代理类
ProductService.LTPService service = new ProductService.LTPService();
// 调用Web方法GetClass1,结果赋值给DoWorkEventArgs的Result对象
e.Result = service.GetProductPrice("001");
}
{
BackgroundWorker backgroundworker = new BackgroundWorker();
// 注册具体异步处理的方法
backgroundworker.DoWork += new DoWorkEventHandler(back_DoWork);
// 注册调用完成后的回调方法
backgroundworker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(back_RunWorkerCompleted);
// 这里开始异步调用
backgroundworker.RunWorkerAsync();
//调用服务的同时客户端处理并不停止
ChangeProcessBar();
}
//完成事件
void back_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
throw e.Error;
progressBar1.Value = progressBar1.Maximum; //调用完成了,把客户端进度条填充满
string price = e.Result.ToString(); //获取处理结果
MessageBox.Show("调用完成。价格是:" + price); //显示从服务器获取的结果值
}
//调用方法
void back_DoWork(object sender, DoWorkEventArgs e)
{
//Web Service代理类
ProductService.LTPService service = new ProductService.LTPService();
// 调用Web方法GetClass1,结果赋值给DoWorkEventArgs的Result对象
e.Result = service.GetProductPrice("001");
}
第二种方法:
调用Web Service的WebMethod中的Async方法实现。
当添加完Web Service的引用以后,会在本地生产代理类,其中,会有一个和原Web Service方法名字相同而后缀是Async的方法
private void button2_Click(object sender, EventArgs e)
{
ProductService.LTPService service = new ProductService.LTPService();//Web Service代理类
//这里开始异步调用
service.GetProductPriceAsync("001");
// 注册调用完成后的回调方法
service.GetProductPriceCompleted += new ProductService.GetProductPriceCompletedEventHandler(GetProductPriceCompleted);
//调用同时客户端处理不停止
ChangeProcessBar();
}
//完成事件
void GetProductPriceCompleted(object sender, ProductService.GetProductPriceCompletedEventArgs e)
{
if (e.Error != null)
throw e.Error;
progressBar1.Value = progressBar1.Maximum; //调用完成了,把客户端进度条填充满
string price = e.Result.ToString(); //获取处理结果
MessageBox.Show("调用完成。价格是:" + price); //显示从服务器获取的结果值
}
{
ProductService.LTPService service = new ProductService.LTPService();//Web Service代理类
//这里开始异步调用
service.GetProductPriceAsync("001");
// 注册调用完成后的回调方法
service.GetProductPriceCompleted += new ProductService.GetProductPriceCompletedEventHandler(GetProductPriceCompleted);
//调用同时客户端处理不停止
ChangeProcessBar();
}
//完成事件
void GetProductPriceCompleted(object sender, ProductService.GetProductPriceCompletedEventArgs e)
{
if (e.Error != null)
throw e.Error;
progressBar1.Value = progressBar1.Maximum; //调用完成了,把客户端进度条填充满
string price = e.Result.ToString(); //获取处理结果
MessageBox.Show("调用完成。价格是:" + price); //显示从服务器获取的结果值
}