实现异步调用web service,防止超时现象

转载 2012年03月27日 23:46:44
普通调用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()方法是处理进度条控制显示的代码,用于代表其他的操作。
//<summary>
//界面的进度条显示
//</summary>
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); //显示从服务器获取的结果值
}

相关文章推荐

异步和同步http请求超时机制

异步超时设置: 例子: Example: do a simple HTTP GET request for http://www.nethype.de/ and print the response...

SAP的WebService发布

1、RFC的介绍 上一篇博文“”已经介绍了SAP是如何创建RFC接口,这里我们就不再详细讲述了。本文中的WebService是基于RFC建立的,因此没有建立好RFC的朋友们,请先阅读上一篇博文,完成R...

Ajax学习笔记(3)异步调用web service以及客户端服务器端数据类型转换

一.WebServiceProxy 一.Methods 1.invoke:执行异步调用web service的函数 Sys.Net.WebServiceProxy.invoke(path,met...

Axis Web Service开发之旅 (十) --异步调用WebService

在前面几篇文章中都是使用同步方式来调用WebService。也就是说,如果被调用的WebService方法长时间不返回,客户端将一直被阻塞,直到该方法返回为止。使用同步方法来调用WebService虽...

使用ASP.NET AJAX异步调用Web Service和页面中的类方法(7):服务器端和客户端数据类型的自动转换:泛型集合类型

====================================================== 注:本文源代码点此下载 =============================...

使用ASP.NET AJAX异步调用Web Service和页面中的类方法(6):服务器端和客户端数据类型的自动转换:复杂类型

====================================================== 注:本文源代码点此下载 =============================...

Axis2 创建 web service (2) : 同步异步调用

继续上个章节的内容,采用示例探讨一下web service同步异步调用的问题
  • navida
  • navida
  • 2014年09月16日 14:22
  • 645

Ajax程序:处理异步调用中的异常(在客户端调用Web Service代理时发生异常的处理办法)

一个好的Web应用程序,强大的异常处理是少不了的。最近在学习Ajax的过程中,我总结了几种不同情况下的处理异步调用中异常的不同办法;想分享给大家; 1,在客户端调用Web Service代理时发生异...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现异步调用web service,防止超时现象
举报原因:
原因补充:

(最多只允许输入30个字)