实现异步调用Web Service,防止页面超时(转载)

本文详细介绍了如何使用BackgroundWorker类和WebService的WebMethod中的Async方法实现异步调用WebService,避免了客户端UI线程的阻塞问题,并通过实例展示了通过BackgroundWorker类实现异步调用的步骤及注意事项,以及使用WebMethod Async方法的异步调用方式,包括关键代码段和事件处理逻辑。

      普通调用Web Service的方法,在Web Service执行期间客户端会一直等待服务执行完毕才能响应。从而造成客户端UI线程的阻塞假死现象。这时候,异步调用就显得很有用,它可以让客户端在调用Web Service时,不至于阻塞客户端的UI线程导致假死,还可以在调用Web Service的同时做些其他的处理。异步调用Web Service也有几种不同的方法,这里介绍常用的两种.

      第一种方法,是通过利用Backgroundworker对象实现。

BackgroundWorker 类允许你在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面(UI)似乎处于停止响应状态。如果你需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 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");

 } 其中,ChangeProcessBar()方法是处理进度条控制显示的代码,用于代表其他的操作。 // //界面的进度条显示 //

void ChangeProcessBar()

{

for (int i = 0; i < 10; i++)

   {

      progressBar1.Value = i; System.Threading.Thread.Sleep(500);

    }

}

 第二种方法,是调用Web Service的WebMethod中的Async方法实现。当添加完Web Service的引用以后,会在本地生成代理类,其中,会有一个和原Web Service方法名字相同而后缀是Async的方法

private void button2_Click(object sender, EventArgs e)

{ //Web Service代理类

 ProductService.LTPService service = new ProductService.LTPService(); //这里开始异步调用 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); //显示从服务器获取的结果值

}

转载于:https://www.cnblogs.com/hf621222/archive/2011/12/09/2282514.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值