ASP.NET应用程序中异步调用Web Service的三种方法
想必做.NET下开发的人对调用Web Service并不陌生,本文不介绍Web Service如何编写,只介绍.NET 应用程序中如何异步调用Web Service的几种方法。示例采用Windows应用程序。异步调用很有用,可以让客户端调用Web Service时(一般耗时未知),不至于阻塞客户端的UI线程导致假死的样子,还可以在调用Web Service的同时做些其它的处理。希望能对大家有所帮助,借此提出更好的解决方法。
详细代码实现
闲言少叙,直接进入主题吧。首先一个声明一个类(将来在客户端与服务器间传递):
public class Class1
...{
private int _ID;
private string _Name;
public int ID
...{
get
...{
return _ID;
}
set
...{
_ID = value;
}
}
public string Name
...{
get
...{
return _Name;
}
set
...{
_Name = value;
}
}
}
其次,声明一个Web方法:
// 省略系统生成的Web Service声明代码,采用默认的
public class Service1 : System.Web.Services.WebService
{
//省略系统生成的Web Service声明代码,采用默认的
[WebMethod]
public Class1 GetClass1 ( int p_TimeSpan )
{
System.Threading.Thread.Sleep( p_TimeSpan ); // 线程停止一段执行,假设一段处理的时间
Class1 r = new Class1();
r.Name = "Async Call";
r.ID = p_TimeSpan;
return r;
}
}
客户端调用代码,设计一个Windows Form窗体来测试,放入3个按钮控件(分别代表3种异步调用方法),一个进度条控件(表示调用Web Service后,客户端继续进行某些操作)。先把3种方法介绍一下:
1. 利用Backgroundworker对象,所在命名空间System.ComponentModel。MSDN原文解释:BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。
2. 利用wsdl.exe生成Web Service的客户端代理类,调用其中WebMethod的Async方法。
3. 利用wsdl.exe生成Web Service的客户端代理类,分别调用其中WebMethod的Begin与End方法。
先用wsdl.exe把上面的Web Service生成客户端代理类并把他编译成类库引入Windows应用项目(这里我没有编译类库,而是直接把代理类.cs文件加入到了Windows应用项目中)。
进入Visual Studio命令行模式,运行
wsdl /out:MyService.cs http://localhost:2732/Service1.asmx
参数说明:第二个参数是Web Service的URL,这个是我机器的本地环境,其他人需要根据情况修改!
注:第一种方式的调用,不采用手动生成Web Service客户端代理类也可以(项目中直接添加Web引用)。后面两种方法都是通过Web Service代理类中提供的方法实现,因此必须生成这个代理类。
看一下处理进度条控件值的代码,几种调用方法都会用到,
private void ChangeProcessBar ( )
{
for ( int i = 0; i < 10; i++ )
{
progressBar1.Value = i;
// 不知道用多少时间,慢慢走吧:)
System.Threading.Thread.Sleep( 500 );
}
}
