C# 同时调用Web服务线程

C# 同时调用Web服务线程,c#,asp.net,httpwebrequest,C#,Asp.net,Httpwebrequest,我有以下问题: 我通过HttpWebRequest在Web服务中提出了几个请求,如下所示。 我正在创建一个所有请求的列表,然后我在列表中做的一件事就是调用每个请求。事实证明,为了运行所有内容,我的页面正在等待所有请求,然后页面被释放。我喜欢做什么? 对于每个请求,系统将在不同的线程中发出请求,每个线程都要完成,将结果放入变量或列表中。。。根据我的需要。 有人有办法帮我吗 非常感谢所有StackOverflow用户,因为他们帮了我很多 米尔顿·卡马拉·戈麦斯(Milton C–mara Gomes

我有以下问题: 我通过HttpWebRequest在Web服务中提出了几个请求,如下所示。 我正在创建一个所有请求的列表,然后我在列表中做的一件事就是调用每个请求。事实证明,为了运行所有内容,我的页面正在等待所有请求,然后页面被释放。我喜欢做什么? 对于每个请求,系统将在不同的线程中发出请求,每个线程都要完成,将结果放入变量或列表中。。。根据我的需要。 有人有办法帮我吗

非常感谢所有StackOverflow用户,因为他们帮了我很多


米尔顿·卡马拉·戈麦斯(Milton C–mara Gomes)

通常的答案是线程。您可以在自己的线程上发出每个请求,然后在所有线程都收到结果后返回,而不是运行每个请求并等待响应。这允许您将等待其他服务执行的大量时间重叠


如果您使用的是.NET4,请尝试TPL的Parallel.ForEach()方法。它允许您指定对集合的每个项目执行特定操作,其功能与内置的
foreach
关键字类似。听起来它应该可以很容易地“插入”到您正在使用的代码中。此处的文档:。

我觉得您好像想要执行一个异步请求。关于这方面已经有很多信息(例如,和)。

List requests=new List();
列表结果=新列表();
Parallel.ForEach(请求,请求=>{
var res=工作(请求);
锁定(结果)结果。添加(res);
});

基于此答案,如果您需要在请求返回时将内容放入某种集合,请确保使用线程安全的集合,如System.Collections.Concurrent中的集合-或者,如果您知道要触发的请求数量,您可以分配一个该大小的数组,只要每次处理响应时都写入不同的数组索引,这将是线程安全的。您可能希望使用ConcurrentBag而不是列表。并发集合为您解决并发问题:
List<...> requests = new List<...>();
List<...> results = new List<...>();
Parallel.ForEach(requests,request=>{
    var res = DoWork(request);
    lock (results) results.Add(res);
});