首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一次调用多个Web服务

一次调用多个Web服务
EN

Stack Overflow用户
提问于 2013-11-18 18:54:04
回答 1查看 4.5K关注 0票数 2

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

做这件事最好的方法是什么?

  • 多线程
  • 异步调用

需要具备以下功能:

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

。。一直在等待WS A,B,C等的响应.

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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延续逻辑。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20055556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档