停止主线程,直到 WCF 调用返回

本文关键字:WCF 调用 返回 直到 线程 | 更新日期: 2023-09-27 18:33:16

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

我在这里尝试了两件事:

  1. 使用布尔变量和无限循环来停止主线程。我更改了 Web 服务调用的 Completed 方法中的值。它导致了一个无限循环,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 服务调用是在静态构造函数中进行的,因此只获取一次数据并多次操作和显示它。

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

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

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

停止主线程,直到 WCF 调用返回

最简单的编码是使用异步操作模型(即您调用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

当然,在实践中,您将需要添加错误处理,因此它不会那么短。