停止主线程,直到 WCF 调用返回
本文关键字:WCF 调用 返回 直到 线程 | 更新日期: 2023-09-27 18:33:16
我是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 异常。
请为我建议一条出路,以及为什么上述方法不起作用。
提前感谢您对此的任何帮助。
最简单的编码是使用异步操作模型(即您调用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
当然,在实践中,您将需要添加错误处理,因此它不会那么短。