解雇可能需要很长时间的多个HttpWebRequest的正确方法

时间:2015-09-03 21:59:48

标签: c# multithreading httprequest task

在我的应用程序中,我有一个文本区域,用户可以在其中输入多个网址(通常是1000左右)。

对于每个网址,我都会以这种方式触发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);

问题:解决此问题的正确方法是什么?

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

我预测人们会将此标记为基于意见,但我敦促您更加努力思考,因为它实际上并非如此:它是基于如何正常使用框架并且应该使用该框架。

1 个答案:

答案 0 :(得分:0)

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

用于实现这一目标的技术并不重要。

我要做的是为HTTP请求使用异步IO并使用one of the common techniques of processing a list of items in parallel asynchronously

你可能应该使用现代的HttpClient类,它可以很好地与await配合使用。但这并非严格要求。

通过实验确定并行度。

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); 
        })); 
}