我们在C#Web应用程序中连接了多个(约15-20个)第三方Web服务。我们正在尝试找到使用多线程或异步同时调用多个Web服务(2-5)的最佳方法。
最好的方法是什么?
它需要具备以下能力:
..所有等待WS A,B,C等的响应时...
我知道我需要使用IAyncResult
,但是我已经看到了一些示例,有些使用了MultiThreading,有些则没有。最好的方法是什么?
您没有在问题中提到它,但是已经用WCF标签标记了该问题,因此我假设您正在尝试使用WCF客户端代理模型进行这些调用。如果不是这种情况,请说明您使用的是哪种客户端技术,我可以更改答案。
首先,我强烈建议您阅读MSDN上的以下文档:如何:异步调用WCF服务操作
首先,您要做的是使用生成WCF客户端代理类SvcUtil.exe
,但指定一个附加标志/async
(或简单地/a
),该标志将生成异步编程模型(APM)方法签名。一旦生成了这些客户端代理,就可以像调用其他APM方法一样简单地调用它们,并提供一个回调,一旦响应可用,该回调将被调用。
使用基于APM的WCF签名将使传出和挂起的网络I / O完全异步,这将释放您的“主”线程来进行您需要同时进行的15-20个调用。同样,当网络调用未完成时,不会浪费任何CPU线程。
现在,如果您使用的是.NET 3.5,则必须使用某种同步原语等待并在每个回调完成后发出信号。不幸的是,3.5中也没有CountdownEvent
类,但是您可以使用Interlocked::Decrement
它进行倒计时,然后ManualResetEventSlim
在达到0时发出信号(或找到提供此功能的第三方库)。如果您使用的是.NET 4.0,则可以将APM模型与基于任务的异步编程(TAP)模型结合起来,然后将其全部TaskFactory::FromAsync
推Tasks
送到a中List<Task>
,然后使用Task::WaitAll
它们来等待它们完成之后再继续操作。最后,如果您使用的是.NET 4.5,甚至可以将其与C#的async
关键字和Task::WhenAll
相反,您可以节省大量的手动TPL延续逻辑。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句