【问题标题】:Stop main thread until WCF Call returns?停止主线程直到 WCF 调用返回?
【发布时间】:2012-05-06 10:40:46
【问题描述】:

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

我在这里尝试了两件事:

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

  2. 我从主线程调用了Web服务,调用完Web服务后,我在主线程上调用Join方法来停止这个线程,直到Web服务返回。

这是代码sn-p:

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 服务调用是在静态构造函数中进行的,所以就像只获取一次数据并多次操作和显示它。

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

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

在此先感谢您提供任何形式的帮助。

【问题讨论】:

  • 我还尝试将 Web 服务调用放入“任务”中,并在调用 Web 服务后调用了 Task.WaitAll() 方法。但这也不起作用。
  • 对不起,我会在这里检查我以前的所有问题并标记适当的答案,但现在请帮助我解决上述问题。

标签: c# .net wcf web-services


【解决方案1】:

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

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

【讨论】:

  • 对 Web 服务的调用返回 void,因此我将无法使用此方法,也不会手动结束 Web 服务调用。已完成的事件会自动触发。我也不会能够获取 IAsyncResult 对象,所以我无法使用 AsyncWaitHandle。
  • @Mohnish:无论 WS 返回什么,您都可以使用此方法,因为BeginXXX always 返回一个IAsyncResult,你只是不会有var resultX = EndXXX 电话的前面。从基于事件的模式切换到这种模式,它会让你的事情变得更容易。如果您真的 不能这样做,请告诉我们原因。
  • 我没有 BeginXXX 方法。我只有 GetXXXAsync() 方法来启动返回 void 的 Web 服务调用以及如何从基于事件的模式切换。我已经使用 Visual Studio 创建了我的 Web 服务作为“WCF 服务”。
  • @Mohnish:你用VS的“添加服务引用”功能生成服务代理了吗?如果是这样,还有一个复选框可以让它自动生成BeginXXX/EndXXX
  • 是的,我已经使用 VS 的添加服务参考生成了服务代理。我没有找到任何此类复选框,它只询问我 Web 服务 URL 并具有“Go”、“Discover”和 Namespace 选项。此外,当我打开高级设置时,显示“生成异步操作”的复选框被禁用并选中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
相关资源
最近更新 更多