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

标签 c# multithreading httprequest task

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

对于每个 url,我以这种方式触发一个 http 请求:

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;

问题:
url 服务器经常处于离线状态,这意味着 request.GetResponse()将挂起 request.Timeout毫秒。
我需要系统不要站在那里等待超时 ;相反,我想利用空闲时间在某个请求等待响应时触发剩余的请求。

我的解决方案
我虽然关于在不同的任务中分派(dispatch)每个请求
因此,我的解决方案如下所示:
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# 异步/多线程/并行机制的 Material (我不太熟悉)之后,我真的很困惑。
在这一点上,我不确定我是异步执行此操作还是使用多个线程或其他方式。
我阅读了有关我应该使用触发请求的方法的建议 异步 他们称之为等待 .但是后来我也发现有人说它不会利用并行性等等。

我预测人们会将此标记为基于意见,但我敦促您更加努力地思考,因为它确实不是:它是关于根据框架的工作方式和应该使用的方式正确使用框架。

最佳答案

这里重要的是您需要并行发出一定数量的 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); 
        })); 
}

关于c# - 触发多个可能需要很长时间的 HttpWebRequest 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32386115/

相关文章:

c# - 摘要和参数文本的约定?

c# - InvokeRequired 方法 - codereview 帮助

node.js - Node js request.post 回调未触发

c# - 拥有多个数据上下文是一种好习惯吗?

c# - 流式输入到 System.Speech.Recognition.SpeechRecognitionEngine

multithreading - 在多个服务之间共享日志文件(每个服务具有多个线程),如何?

c# - 应用程序在另一个线程中不会故意崩溃

c# - 在 Azure 辅助角色 http 请求中获取 http 500

java - 如何从 java 中的 URL 读取 XML 响应?

c# - 库 (DLL) 中的静态变量是否由引用该库的所有进程共享?