实现异步调用Web Service,防止页面超时

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

     第一种方法,是经过利用Backgroundworker对象实现。 BackgroundWorker 类容许你在单独的专用线程上运行操做。耗时的操做(以下载和数据库事务)在长时间运行时可能会致使用户界面(UI)彷佛处于中止响应状态。若是你须要能进行响应的用户界面,并且面临与这类操做相关的长时间延迟,则可使用 BackgroundWorker 类方便地解决问题。 服务器

private void button1_Click(object sender, EventArgs e) 异步

{ ide

    BackgroundWorker backgroundworker = new BackgroundWorker(); 线程

    //注册具体异步处理的方法 代理

    backgroundworker.DoWork += new DoWorkEventHandler(back_DoWork); 对象

    //注册调用完成后的回调方法 事件

    backgroundworker.RunWorkerCompleted += 事务

        new RunWorkerCompletedEventHandler(back_RunWorkerCompleted); string

    //这里开始异步调用

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

}

相关文章
相关标签/搜索