【问题标题】:Multiple Web Service Calls At Once一次多个 Web 服务调用
【发布时间】:2013-11-18 18:54:04
【问题描述】:

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

最好的方法是什么?

  • 多线程
  • 异步调用

它需要能够:

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

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

我知道我需要使用IAyncResult,但我看到了一些示例,有些使用了多线程,有些则没有。 最好的方法是什么?

【问题讨论】:

  • 您好,您写过代码吗?顺便说一句,你知道并行代码不是异步的吗?

标签: c# multithreading wcf web-services asynchronous


【解决方案1】:

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

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

首先,您要做的是使用SvcUtil.exe 生成WCF 客户端代理类,但指定一个附加标志/async(或简称/a),它将生成Asynchronous Programming Model (APM) 方法签名。一旦生成了这些客户端代理,您就可以像调用任何其他 APM 方法一样简单地调用它们,并提供一个回调,一旦响应可用,就会调用该回调。

利用基于 APM 的 WCF 签名将使传出和挂起的网络 I/O 完全异步,这将释放您的“主”线程来进行需要同时进行的 15-20 个调用。此外,当网络调用未完成时,不会浪费任何 CPU 线程。

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

【讨论】:

  • 他可以创建一个BackgroundTasks,他们将允许他创建对服务的并行异步调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 2014-05-21
  • 1970-01-01
相关资源
最近更新 更多