zoukankan      html  css  js  c++  java
  • 实现异步调用Web Service【摘】

     

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

    圆角矩形: 代码示例:第一种方法,是通过利用Backgroundworker对象实现。BackgroundWorker 类允许你在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面(UI)似乎处于停止响应状态。如果你需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。

                                       (示例位置:光盘\code\ch07\WindowsFormsApplication1)

    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的方法。

                                   (示例位置:光盘\code\ch07\WindowsFormsApplication1)

    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); //显示从服务器获取的结果值

    }

  • 相关阅读:
    BOS项目 第1天(项目概述、PowerDesigner、svn、easyui的使用)
    mavenbos项目第二天(msyql操作、ssh配置集成、PowerDesinger、自定义登陆拦截器)
    mavenbos项目第一天(maven、远程部署、svn、easyui的使用。)
    json字符串和java对象的互相转换
    mysql设置环境变量
    windows下mysql的安装
    Unity3d 创建线程 子线程与主线程通信
    Unity3d 子线程能做的事
    Unity3d Resources TextAsset 文本
    NGUI Checkbox与PlayerPrefs
  • 原文地址:https://www.cnblogs.com/flyinthesky/p/1575356.html
Copyright © 2011-2022 走看看