-1

我是 Web 服务的新手,从 WCF 开始。我有多个 Web 服务调用,每个调用都是异步完成的。但我的问题是,主线程应该停止,直到所有 Web 服务调用都返回,并且当所有 Web 服务调用都返回时,它才应该继续。

我在这里尝试了两件事:

  1. 使用布尔变量和无限循环来停止主线程。我更改了CompletedWeb 服务调用方法中的值。它导致了一个无限循环,并且Completed从未被调用。

  2. 我从主线程进行了 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 服务调用是在静态构造函数中进行的,以便获取数据只需一次,并多次操作和显示。

但是发生的情况是主线程在获取数据并继续执行操作之前不会停止,我得到一个空异常。

请为我提出一条出路,以及为什么上述方法不起作用。

提前感谢您对此提供的任何帮助。

4

1 回答 1

0

最简单的代码是使用异步操作模型(即您调用BeginXXX它,它会返回一个IAsyncResult给您)并按照此处概述的过程进行所有异步调用。如果您使用 Visual Studio 附带的服务代理生成器,则此模型是开箱即用的。

您将从进行异步调用开始:

var async1 = service.BeginFoo();
var async2 = service.BeginBar();
// more similar calls

然后一一结束——顺序无关紧要:

var result1 = service.EndFoo(async1);
var result2 = service.EndBar(async2);
// etc

当然在实践中你需要添加错误处理,所以它不会那么短。

于 2012-05-06T11:01:14.140 回答