Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.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#_Asp.net_Asp.net Mvc 3 - Fatal编程技术网

C# 从方法调用两个web服务而不相互阻塞的最佳方法

C# 从方法调用两个web服务而不相互阻塞的最佳方法,c#,asp.net,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc 3,我有一个MVC3应用程序,在控制器中的一个操作中,我需要接触两个不同的web服务以获取数据 其中一个的结果并不依赖于另一个,因此理想情况下,我希望并行调用这些服务中的每一个,这样我就不会因为在执行另一个服务之前等待第一个服务而招致性能损失 它们可以(也应该)一起阻止操作返回,直到两个web服务返回它们的数据,因为它们的响应都应该在ActionResult负载中发送回来。创建一对WaitHandles,调用两个异步传递等待句柄的方法,清除各自结果处理程序中的每个方法,使用WaitHandle.Wa

我有一个MVC3应用程序,在控制器中的一个操作中,我需要接触两个不同的web服务以获取数据

其中一个的结果并不依赖于另一个,因此理想情况下,我希望并行调用这些服务中的每一个,这样我就不会因为在执行另一个服务之前等待第一个服务而招致性能损失


它们可以(也应该)一起阻止操作返回,直到两个web服务返回它们的数据,因为它们的响应都应该在ActionResult负载中发送回来。

创建一对WaitHandles,调用两个异步传递等待句柄的方法,清除各自结果处理程序中的每个方法,使用WaitHandle.WaitAll进行阻止,直到两个句柄都被清除。

您可能会发现在C#中创建异步方法非常有用


但是,我们是否可以假设,您更感兴趣的是,如何确保无论返回哪个调用需要更长的时间,您都会阻止,直到它们都返回?

HttpWebRequest允许您异步发送web服务请求,但这些方法使用回调,这样他们就不会在你的两个请求被拒绝后阻止你了

要等待两个回调,可以将每个调用包装为一个任务,然后使用同步http调用并行启动两个任务。然后使用WaitAll,等待两个任务完成。这样做的好处是WaitAll和Task可以轻松实现超时,而对于异步请求,处理超时可能是一个挑战

我现在在手机上,所以我无法获取代码,但这个网站看起来是一个很好的起点

请记住,将http函数传递给任务构造函数。创建两个任务后,将它们添加到列表中。您的WaitAll将使用此列表检查是否完成

如果不喜欢使用同步http调用,可以创建一个线程安全计数器,该计数器在异步回调函数中递增。然后,控制器将在一个while循环中等待超时或计数器等于2


我想您也可以在我的第一个答案中使用异步控制器,它仍然使用多线程同步调用,但异步控制器将从处理器中释放操作。

由于您需要异步调用两个服务,我建议您使用TPL(Task Parllel Library)


下面是一个关于如何使用“我已经做到了”的示例,效果很好。

顺便说一句,你的标题不需要以“C”开头。这就是标签的作用。谢谢约翰-我会记住这一点。好吧,在这种情况下,你应该能够做到高迪简洁的建议。让哪一个异步并不重要,因为不管怎样,都必须等待它们。您应该能够将异步设置为它已返回的指示,并阻止另一个设置,直到它已返回且第一个设置的指示已设置为止。这有意义吗?尽管高迪很简短,但显然他在这方面的知识要比我多。你应该听他的。谢谢,这是有意义的,也是我想要的。这会有用的。WaitAny在任何句柄存在时等待。然后设置一个超时,等待句柄清除或超时。NET任务是一个断开的链接
Parallel.Invoke(
    () => result1 = CallServer1(),
    () => result2 = CallServer2());