异步调用Web Service就是避免客户端在调用耗时间的服务方法的时候出现假死状态。那么怎么异步调用呢?

微软的 System.ComponentModel.BackgroundWorker 类可以解决此类问题

(1)注册bw.DoWork += new DoWorkEventHandler(bw_DoWork); 在 private void bw_DoWork(object sender, DoWorkEventArgs e)方法中调用Web服务;

(2)  注册bw.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);在private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)方法中针对调用后的结果做调用结束后的操作。

(3)bw.RunWorkerAsync();语句是开始异步调用。

(1)和(2)中的调用结果通过e.Result传递。在bw_RunWorkerCompleted中将调用服务返回的结果e.Result进行AS映射回所需的类型。例如:ServiceReference1.MClass m = new ServiceReference1.MClass();
  m = e.Result as ServiceReference1.MClass;

还有一种方法是使用条件Web引用时候生成的客户端代理类,注意是添加Web引用,不是添加服务引用,在VS2008后续版本中添加Web引用可以点击添加服务引用的选项页面的“高级”按钮。如下图:

 

 

   protected void Button1_Click(object sender, EventArgs e)
    {
        T_WebApplication.localhost.Service1 s = new T_WebApplication.localhost.Service1();
        s.GetClass1Completed += new T_WebApplication.localhost.GetClass1CompletedEventHandler(s_GetClass1Completed);
        s.GetClass1Async();
    }
    public void s_GetClass1Completed(object sender, T_WebApplication.localhost.GetClass1CompletedEventArgs e)
    {
        if (e.Error != null)
        {
            throw e.Error;
        }
        else
        {
            T_WebApplication.localhost.MClass m = e.Result as T_WebApplication.localhost.MClass;
            Response.Write(m.ID + m.Name);
        }
    }