实现异步调用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); //显示从服务器获取的结果值
}

记录:解决后端server因一个timeout导致的雪崩

问题描述 相关组件: 1. WebService:对外提供web接口服务,这里启动了5个(端口分别为:9001-9005) 2. nginx:反向代理5个webService做负载均...
  • dotedy
  • dotedy
  • 2015年12月24日 18:53
  • 434

WebService异步

 异步是一个庞大的话题,但总的来说,我认为它有不阻塞当前请求线程、提高吞吐量等作用。 对于服务端和客户端互相调用的程序,我认为异步可以分为客户端异步、服务端异步,并且他们异步操作互不影响。...
  • airingyuan
  • airingyuan
  • 2015年04月10日 11:05
  • 617

调用webservice 设置超时时间

1. 服务器端设置超时 在 web.config 的 system.web 里添加如下配置项: executionTimeout="60" /> 以上时间单位是秒. 记得要把 web.c...
  • sophiazhou
  • sophiazhou
  • 2012年03月27日 23:40
  • 10357

VS2012 C#.NET 调用SAP WebService

VS2012 调用SAP Web Service实例,附带源码
  • a419893240
  • a419893240
  • 2016年08月03日 16:35
  • 2145

真正的 Tornado 异步非阻塞

其中 Tornado 的定义是 Web 框架和异步网络库,其中他具备有异步非阻塞能力,能解决他两个框架请求阻塞的问题,在需要并发能力时候就应该使用 Tornado。但是在实际使用过程中很容易把 Tor...
  • u013038616
  • u013038616
  • 2017年05月31日 16:46
  • 4132

聊聊java高并发系统之异步非阻塞

聊聊java高并发系统之异步非阻塞 几种调用方式 同步阻塞调用 即串行调用,响应时间为所有服务的响应时间总和; 半异步(异步Future) 线程池...
  • chenglinhust
  • chenglinhust
  • 2016年09月16日 10:51
  • 2304

java高并发系统之异步非阻塞

在做电商系统时,流量入口如首页、活动页、商品详情页等系统承载了网站的大部分流量,而这些系统的主要职责包括聚合数据拼装模板、热点统计、缓存、下游功能降级开关、托底数据等等。其中聚合数据需要调用其它多个系...
  • u010942020
  • u010942020
  • 2016年08月16日 09:09
  • 4551

异步调用Web Service程序 小例子,C++.net源代码编写

  • 2010年03月15日 20:50
  • 2.27MB
  • 下载

使用ASP.NET AJAX异步调用Web Service和页面中的类方法

  • 2009年09月12日 16:42
  • 2.09MB
  • 下载

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

====================================================== 注:本文源代码点此下载 =============================...
  • javazhuanzai
  • javazhuanzai
  • 2012年01月15日 04:28
  • 428
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现异步调用web service,防止超时现象
举报原因:
原因补充:

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