跟踪多个异步调用

时间:2012-01-17 22:45:50

标签: c# asynchronous c#-5.0

有一种方法可以使用

获取服务器响应
var response = (HttpWebResponse)await request.GetResponseAsync();

还有其他代码来设置请​​求。我用异步方法包装它。此方法将url作为参数。对此方法的调用再次用一个方法包装,它构造了实际的URL。

想象一下,最终的方法看起来像这样:

string resultString = await GetResultString(parameter);

然后出现以下问题:我想同时发送多个请求。我有一个参数列表。我是这样做的:

var tasks = new List<Task<string>>();
foreach(parameter in parameters)
{
    tasks.Add(GetResultString(parameter));
}
List<string> resultStrings = await TaskEx.WhenAll(tasks);

这也很好。但请求的数量是可变的。所以它可能是10个请求。但是你也可以发射10.000个请求甚至100.000个。所以我考虑在进度条中监控进度。但我怎么能这样做?我已经查看了this段代码,但我无法知道如何将其用于我的代码。每次任务完成时我都需要提出一个事件。但是当任务完成时没有任何回调怎么办?

谢谢和问候

PS:有人可以告诉我如何使用copy&amp; amp;粘贴代码而不在每行代码前放置四个空格?我无法从高级帮助中获得任何帮助。我无法让它发挥作用。对不起,我的英语不太完美。我是德国人。 : - )

2 个答案:

答案 0 :(得分:0)

嗯,首先你必须问问自己你想要什么。如果你有10,000个请求,并且你能够真正让它们正常等待,那么它们都在进行中。在这种特殊情况下,您不知道每项任务是如何完成的,只完成了多少任务。

如果您有5个任务,那么进度时间线可能如下所示:

0 ------------------------------------------ 1-23- 4 --- 5

你想说它完成了1/5吗?看起来1/5是误导性的,因为你可能差不多完成了?

但除此之外,the link you mentioned应该涵盖你想要的东西。为什么不起作用?

答案 1 :(得分:0)

@McKay和craig1231:你是对的。我在链接中提供的代码非常好,除了在那里使用旧的AsyncCtpLib(好吧,帖子在2010年底发布)。代码需要重新修改一下。但是我在这里提出这个问题之前就解决了这个问题。

我的问题只是我不明白ProgressChangedEvent何时被引发。

  

基本上,当您实例化此类[Progress<T>,而不是自新AsyncCtpLib发布以来EventProgress<T>]时,它会捕获当前   thread的SynchronizationContext。然后,每次调用Report时   在TAP方法中,它引发了ProgressChanged事件   正确的主题。

答案就在那里。但是,谢谢,无论如何。 :)