我是Web服务的新手,并从WCF开始。我有多个Web服务调用,每个调用都是异步完成的。但我的问题是主线程应该停止,直到所有的Web服务调用返回,当所有的Web服务调用只返回时,它应该继续。
我在这里试了两件事:
使用布尔变量和无限循环来停止主线程。我更改了Web服务调用的Completed
方法中的值。它导致了一个无限循环,Completed
从未被调用过。
我从主线程进行了Web服务调用,在进行Web服务调用之后,我在主线程上调用了Join方法来停止该线程,直到Web服务返回。
这是代码段:
ServerMonitoringBoardDataService.ServerMonitoringBoardDataServiceClient c = new ServerMonitoringBoardDataService.ServerMonitoringBoardDataServiceClient();
c.GetEnvironmentAndServersCompleted += new EventHandler<ServerMonitoringBoardDataService.GetEnvironmentAndServersCompletedEventArgs>(c_GetEnvironmentAndServersCompleted);
c.GetEnvironmentAndServersAsync();
void c_GetEnvironmentAndServersCompleted(object sender, ServerMonitoringBoardDataService.GetEnvironmentAndServersCompletedEventArgs e)
{
var x = e.Result;
}
我遇到问题的原因是,多个Web服务调用将数据作为列表返回,我对这些数据进行了一些操作,然后将其显示在UI上.Web服务调用是在静态构造函数中进行的,所以至于只获取一次数据并多次操作和显示它。
但是发生的事情是主线程在获取数据之前不会停止并移动到执行操作,我得到Null Exception。
请为我提出一条出路,以及为何上述方法无效。
提前感谢您提供任何帮助。
答案 0 :(得分:0)
最简单的代码是使用异步操作模型(即您致电BeginXXX
并向您返回IAsyncResult
)并按照here概述的程序执行所有操作异步调用。如果您使用Visual Studio附带的服务代理生成器,则可以立即使用此模型。
您将首先进行异步调用:
var async1 = service.BeginFoo();
var async2 = service.BeginBar();
// more similar calls
然后一个接一个地结束它们 - 顺序并不重要:
var result1 = service.EndFoo(async1);
var result2 = service.EndBar(async2);
// etc
当然在实践中你需要添加错误处理,所以它不会那么短。