【发布时间】:2014-07-31 04:43:33
【问题描述】:
谁能向我解释为什么我会从这段代码中收到ArgumentException?它告诉我Task.WhenAll 函数中的tasks 参数包含空值。但是,当我运行它时,它只会偶尔发生一次。
static async Task TestRequestSpeed()
{
var requestTasks = new List<Task>();
await Task.Run(() =>
{
Parallel.For(0, 50, (i) =>
{
requestTasks.Add(HttpSocket.Instance.GetAsync("http://google.com"));
});
});
await Task.WhenAll(requestTasks).ConfigureAwait(false);
}
我不明白这些请求中的一个最终会如何返回一个空任务。如果有人能指导我解决潜在问题,我将不胜感激!
更新:
我应该澄清一下,我的意图是并行发出多个请求以加快执行速度。我正在开发一个个人项目,该项目需要在单个方法调用中发出多达 200 个请求,我希望减少发出这些请求所需的时间。目前,使用正常的 async-await 过程执行此操作大约需要 45 秒,因此我希望并行发出请求以尽可能减少该时间。如果有更好的方法,请告诉我。
【问题讨论】:
-
我不确定是否是这样,但您知道您在该行缺少右括号吗? await Task.WhenAll(requestTasks).ConfigureAwait( 应该是 await Task.WhenAll(requestTasks).ConfigureAwait()
-
你的
HttpSocket线程安全吗? -
您到底为什么要将
requestTasks.Add放入Parallel.For?这样做你什么也得不到,实际代码应该更慢,GetAsync的重点是你在做I/O async。线程并行化只会减慢速度。 -
@Aron 我要做的是并行发出多个请求。我正在做一个个人项目,我正在尝试学习如何同时提出多个请求以加快执行速度。正常的 async-await 给了我不满意的表现。我应该在
Parallel.ForEach块内执行同步请求吗? -
不,你错了。您正在制作线程以发送请求。但是上下文切换的过程很慢。发送请求很快,所以按顺序发送会更快。
标签: c# .net multithreading task-parallel-library async-await