我们在C#网络应用程序中连接多个第三方web服务(大约15-20个)。我们试图找到最好的方法,使用多线程或异步同时调用多个web服务(2-5)。
做这件事最好的方法是什么?
需要具备以下功能:
。。一直在等待WS A,B,C等的响应.
我知道我需要使用IAyncResult,但是我看到了一些例子,还有一些使用了MultiThreading,而有些则没有。最好的方法是什么?
发布于 2013-11-18 19:25:39
您在问题中没有提到它,但是您已经用WCF标记标记了这个问题,所以我假设您正在尝试使用WCF客户端代理模型进行这些调用。如果不是这样,请解释您正在使用的客户端技术,我可以修改我的答案。
首先,我强烈建议您阅读MSDN:如何:异步调用WCF服务操作上的文档。
首先,您要做的是用SvcUtil.exe生成WCF客户端代理类,但是指定一个额外的标志,/async (或简单地说是/a),它将生成异步编程模型(APM)方法签名。一旦生成了这些客户机代理,就可以像任何其他APM方法一样调用它们,并提供一个回调,一旦响应可用,就会调用该回调。
使用基于APM的WCF签名将使传出和挂起的网络I/O完全异步,这将释放您的“主”线程来进行您需要同时进行的15-20次调用。另外,虽然网络调用尚未完成,但不会浪费CPU线程。
现在,如果您使用的是.NET 3.5,则必须使用某种同步原语来等待并在每个回调完成后发出信号。不幸的是,3.5中也没有班级,但您只需使用Interlocked::Decrement进行倒计时,然后在ManualResetEventSlim达到0时发出信号(或找到提供此功能的第三方库)。如果您使用的是.NET 4.0,则可以将APM模型与利用TaskFactory::FromAsync的基于任务的异步编程(TAP)模型组合起来,并将所有Tasks推入List<Task>中,然后使用Task::WaitAll等待它们全部完成,然后继续使用fwd。最后,如果您使用的是.NET 4.5,那么您甚至可以将它与C#的async关键字和Task::WhenAll巧妙地结合在一起,并为自己节省大量的手工TPL延续逻辑。
https://stackoverflow.com/questions/20055556
复制相似问题