C# 触发多个HttpWebRequest的正确方法可能需要很长时间

C# 触发多个HttpWebRequest的正确方法可能需要很长时间,c#,multithreading,httprequest,task,C#,Multithreading,Httprequest,Task,在我的应用程序中,我有一个文本区域,用户可以在其中输入几个URL(通常是1000左右的数字) 对于每个url,我通过以下方式发出http请求: HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; HttpWebResponse response = request.GetResponse() as HttpWebResponse; 问题: url服务器经常处于脱机状态,这意味着request.GetRespons

在我的应用程序中,我有一个文本区域,用户可以在其中输入几个URL(通常是1000左右的数字)

对于每个url,我通过以下方式发出http请求:

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
问题: url服务器经常处于脱机状态,这意味着
request.GetResponse()
将挂起
request.Timeout
毫秒。 我需要系统不要站在那里等待超时时间;相反,我希望在某个请求等待响应时,利用空闲时间触发其余的请求

我的解决方案 我考虑将每个请求分派到不同的任务中 因此,我的解决方案如下所示:

Task[] tasks = new Task[numberOfUrls];
for (int i = 0; i < numberOfUrls; ++i)
{
    int index = i;
    tasks[index] = Task.Factory.StartNew(() => Request(urls[index]));
}

Task.WaitAll(tasks);
Task[]tasks=新任务[numberOfUrls];
for(int i=0;iRequest(url[index]);
}
Task.WaitAll(任务);
问题:解决此问题的正确方法是什么?

我不确定我的方法是否正确,因为在阅读了大量关于整个C#async/多线程/并行机制(我不是很熟悉)的材料后,我真的感到困惑。 在这一点上,我不确定我是否在异步或使用多个线程或其他方式来完成这项工作。 我阅读了一些建议,建议我应该使触发请求的方法异步,然后它们调用它并等待。但后来我也发现有人说它不会利用并行性等等


我预测人们会将此标记为基于意见的,但我敦促您更仔细地思考,因为事实并非如此:这是关于根据框架的工作方式和应该使用的方式正确使用框架。

这里重要的是,您需要并行发出一定数量的HTTP请求。总是有很多优秀的。这就是你在这里取得成绩的原因

你用来实现这一目标的技术并不重要

我要做的是对HTTP请求使用异步IO并使用

您可能应该使用现代的
HttpClient
类,它可以很好地与await一起工作。但这并不是严格要求的

通过实验确定平行度


公共静态任务ForEachAsync(此IEnumerable源代码,int-dop,Func-body)
{ 
返回任务。当所有(
从Partitioner.Create(source).GetPartitions(dop)中的分区
选择Task.Run(异步委托{
使用(分区)
while(partition.MoveNext())
等待体(partition.Current);
})); 
}
public static Task ForEachAsync<T>(this IEnumerable<T> source, int dop, Func<T, Task> body) 
{ 
    return Task.WhenAll( 
        from partition in Partitioner.Create(source).GetPartitions(dop) 
        select Task.Run(async delegate { 
            using (partition) 
                while (partition.MoveNext()) 
                    await body(partition.Current); 
        })); 
}