普通调用Web Service的方法在Web Service执行期间客户端会一直等待服务执行完毕才能响应从而造成客户端UI线程的阻塞假死现象这时候异步调用就显得很有用它可以让客户端在调用Web Service时不至于阻塞客户端的UI线程导致假死还可以在调用Web Service的同时做些其他的处理异步调用Web Service也有几种不同的方法这里介绍常用的两种
第一种方法是通过利用Backgroundworker对象实现 BackgroundWorker 类允许你在单独的专用线程上运行操作耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面(UI)似乎处于停止响应状态如果你需要能进行响应的用户界面而且面临与这类操作相关的长时间延迟则可以使用 BackgroundWorker 类方便地解决问题
private void button_Click(object sender EventArgs e)
{
BackgroundWorker backgroundworker = new BackgroundWorker();
//注册具体异步处理的方法
backgroundworkerDoWork += new DoWorkEventHandler(back_DoWork);
//注册调用完成后的回调方法
backgroundworkerRunWorkerCompleted +=
new RunWorkerCompletedEventHandler(back_RunWorkerCompleted);
//这里开始异步调用
backgroundworkerRunWorkerAsync();
//调用服务的同时客户端处理并不停止
ChangeProcessBar();
}
//完成事件
void back_RunWorkerCompleted(object sender RunWorkerCompletedEventArgs e)
{
if (eError != null)
throw eError;
progressBarValue = progressBarMaximum; //调用完成了把客户端进度条填充满
string price = eResultToString(); //获取处理结果
MessageBoxShow(调用完成价格是 + price); //显示从服务器获取的结果值
}
//调用方法
void back_DoWork(object sender DoWorkEventArgs e)
{
//Web Service代理类
ProductServiceLTPService service = new ProductServiceLTPService();
//调用Web方法GetClass将结果赋值给DoWorkEventArgs的Result对象
eResult = serviceGetProductPrice();
}
其中ChangeProcessBar()方法是处理进度条控制显示的代码用于代表其他的操作
//<summary>
//界面的进度条显示
//</summary>
void ChangeProcessBar()
{
for (int i = ; i < ; i++)
{
progressBarValue = i;
SystemThreadingThreadSleep();
}
}
第二种方法是调用Web Service的WebMethod中的Async方法实现当添加完Web Service的引用以后会在本地生成代理类其中会有一个和原Web Service方法名字相同而后缀是Async的方法
private void button_Click(object sender EventArgs e)
{
//Web Service代理类
ProductServiceLTPService service = new ProductServiceLTPService();
//这里开始异步调用
serviceGetProductPriceAsync();
//注册调用完成后的回调方法
serviceGetProductPriceCompleted += new ProductService
GetProductPriceCompletedEventHandler(GetProductPriceCompleted);
//调用同时客户端处理不停止
ChangeProcessBar();
}
//完成事件处理方法
void GetProductPriceCompleted(object sender ProductService
GetProductPriceCompletedEventArgs e)
{
if (eError != null)
throw eError;
progressBarValue = progressBarMaximum; //调用完成了把客户端进度条填充满
string price = eResultToString(); //获取处理结果
MessageBoxShow(调用完成价格是 + price); //显示从服务器获取的结果值
}