普通调用Web Service的方法,在Web Service执行期间客户端会一直等待服务执行完毕才能响应。从而造成客户端UI线程的阻塞假死现象。这时候,异步调用就显得很有用,它可以让客户端在调用Web Service时,不至于阻塞客户端的UI线程导致假死,还可以在调用Web Service的同时做些其他的处理。异步调用Web Service也有几种不同的方法,这里介绍常用的两种。
第一种方法,是通过利用Backgroundworker对象实现。 BackgroundWorker 类允许你在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面(UI)似乎处于停止响应状态。如果你需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。
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)
{
ProductService.LTPService service =
new
ProductService.LTPService();
e.Result = service.GetProductPrice(
"001"
);
}
其中,ChangeProcessBar()方法是处理进度条控制显示的代码,用于代表其他的操作。
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的方法。
private
void
button2_Click(
object
sender, EventArgs e)
{
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);
}