我们在C#Web应用程序中连接多个(大约15-20个)第三方Web服务。我们正在尝试找到使用多线程或异步同时调用多个Web服务(2-5)的最佳方法。
最好的方法是什么?
需要能够:
..等待WS A,B,C等的响应......
我知道我需要使用IAyncResult
,但我看过一些例子,有些使用MultiThreading,有些则没有。 最好的方式是什么?
答案 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模型与利用ManualResetEventSlim
的Task-based Asynchronous Programming (TAP)模型相结合,并将所有Tasks
推送到List<Task>
,然后使用{ {3}}在继续前进之前等待所有人完成。最后,如果你使用的是.NET 4.5,你甚至可以优雅地将它与C#的async
关键字和TaskFactory::FromAsync
结合起来,并为自己节省大量的手动TPL延续逻辑。