一次多个Web服务调用

时间:2013-11-18 18:54:04

标签: c# multithreading wcf web-services asynchronous

我们在C#Web应用程序中连接多个(大约15-20个)第三方Web服务。我们正在尝试找到使用多线程或异步同时调用多个Web服务(2-5)的最佳方法。

最好的方法是什么?

  • 多线程
  • 异步通话

需要能够:

  • 连接到Web服务A
  • 发送请求,
  • 连接到Web服务B
  • 发送请求
  • 连接到Web Service C
  • 发送请求
  • 等等...

..等待WS A,B,C等的响应......

我知道我需要使用IAyncResult,但我看过一些例子,有些使用MultiThreading,有些则没有。 最好的方式是什么?

1 个答案:

答案 0 :(得分:1)

你没有在你的问题中提到它,但是你已经用WCF标签标记了这个问题,所以我假设你正在尝试使用WCF客户端代理模型进行这些调用。如果不是这种情况,请说明您使用的客户端技术,我可以修改我的答案。

首先,我强烈建议您在MSDN上阅读此文档:How to: Call WCF Service Operations Asynchronously

首先,您要做的是使用SvcUtil.exe生成WCF客户端代理类,但指定另一个标记/async(或简称为/a),这将生成{ {3}}方法签名。生成这些客户端代理后,您可以像调用任何其他APM方法一样调用它们,并提供一旦响应可用就会调用的回调。

利用基于APM的WCF签名将使传出和挂起的网络I / O完全异步,从而释放“主”线程,使您需要同时进行15-20次调用。此外,虽然网络调用非常出色,但不会浪费任何CPU线程。

现在,如果您使用的是.NET 3.5,则必须使用某种同步原语等待,并在每次回调完成后发出信号。不幸的是,3.5中也没有Asynchronous Programming Model (APM),但您可以使用CountdownEvent class进行倒计时,然后在Interlocked::Decrement达到0时发出信号(或找到提供此信息的第三方库) 。如果您使用的是.NET 4.0,则可以将APM模型与利用ManualResetEventSlimTask-based Asynchronous Programming (TAP)模型相结合,并将所有Tasks推送到List<Task>,然后使用{ {3}}在继续前进之前等待所有人完成。最后,如果你使用的是.NET 4.5,你甚至可以优雅地将它与C#的async关键字和TaskFactory::FromAsync结合起来,并为自己节省大量的手动TPL延续逻辑。