Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一次调用多个Web服务_C#_Multithreading_Wcf_Web Services_Asynchronous - Fatal编程技术网

C# 一次调用多个Web服务

C# 一次调用多个Web服务,c#,multithreading,wcf,web-services,asynchronous,C#,Multithreading,Wcf,Web Services,Asynchronous,我们在C#web应用程序中连接多个(大约15-20个)第三方web服务。我们正试图找到使用多线程或异步同时调用多个web服务(2-5)的最佳方法 最好的方法是什么 多线程 异步调用 它需要能够: 连接到Web服务A 发送请求 连接到Web服务B 发送请求 连接到Web服务C 发送请求 等等 。。在等待WS A、B、C等的响应时 我知道我需要使用IAyncResult,但我看到了一些示例,有些示例使用多线程,有些则不使用最好的方法是什么?您的问题中没有提到这一点,但您已经用WCF标记了问题

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

最好的方法是什么

  • 多线程
  • 异步调用
它需要能够:

  • 连接到Web服务A
  • 发送请求
  • 连接到Web服务B
  • 发送请求
  • 连接到Web服务C
  • 发送请求
  • 等等
。。在等待WS A、B、C等的响应时


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

您的问题中没有提到这一点,但您已经用WCF标记了问题,因此我假设您正在尝试使用WCF客户端代理模型进行这些调用。如果不是这样,请解释您使用的客户端技术,我可以修改我的答案

首先,我强烈建议您阅读MSDN上的以下文档:

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

利用基于APM的WCF签名将使传出和挂起的网络I/O完全异步,这将释放您的“主”线程,以便同时进行15-20次呼叫。此外,虽然网络调用未完成,但不会浪费CPU线程


现在,如果您使用的是.NET3.5,则必须使用某种类型的同步原语来等待并在每个回调完成后发出信号。不幸的是,3.5中也没有,但您可以使用进行倒计时,然后在a达到0时发出信号(或者找到提供此功能的第三方库)。如果您使用的是.NET 4.0,则可以将APM模型与模型结合起来,将所有
任务
推到
列表
中,然后使用等待它们全部完成,然后再继续fwd。最后,如果您使用的是.NET4.5,您甚至可以将其与C#的
async
关键字巧妙地结合起来,从而节省大量手动TPL延续逻辑。

您好,您编写过代码吗?顺便问一下,你知道并行代码不是异步的吗?他可以创建一个
BackgroundTasks
,这样他就可以创建对服务的并行异步调用。