多个异步调用的进度跟踪

本文关键字:跟踪 调用 异步 | 更新日期: 2023-09-27 18:20:40

有一种方法可以通过获得服务器响应

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个请求。但也有可能你解雇了10000个请求,甚至100000个。所以我考虑在进度条中监控进度。但我怎么能做到这一点呢?我已经看了这段代码,但我不知道如何将其用于我的代码。每次任务完成后,我都需要发起一个活动。但是,当任务完成时没有任何回调时,该怎么办?

感谢并问候

附言:有人能告诉我如何使用复印件吗;粘贴代码而不在每一行代码前面放四个空格?我无法从高级帮助中得到任何帮助。我就是做不到。很抱歉我的英语不太好。我是德国人。:-)

多个异步调用的进度跟踪

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

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

0-------------------------------------------------1-24--5

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

但除此之外,你提到的链接应该涵盖你想要的内容。为什么它不起作用?

@McKay和craig1231:你是对的。我在链接中提供的代码非常好,只是使用了一个旧的AsyncCtpLib(好吧,该帖子在2010年底发布)。代码需要重新编写一点。但我甚至在问这个问题之前就解决了这个问题。

我的问题是我不明白ProgressChangedEvent是什么时候引发的。

基本上,当您实例化这个类[Progress<T>,而不是新的AsyncCtpLib发布后的EventProgress<T>]时,它会捕获当前线程的SynchronizationContext。然后,每次从调用Report时在TAP方法中,它在正确的线程。

答案就在那里。不过还是谢谢你。:)