【问题标题】:progress tracking of multiple async calls多个异步调用的进度跟踪
【发布时间】:2016-01-26 23:34:07
【问题描述】:

有一种方法可以通过

获取服务器响应
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:有人能告诉我如何在代码中使用复制和粘贴而不在每一行代码前放置四个空格吗?我无法从高级帮助中获得任何帮助。我只是无法让它工作。我很抱歉我的英语不是太完美。我是德国人。 :-)

【问题讨论】:

  • 从编辑器(即 Visual Studio)复制并粘贴代码。突出显示文本并点击编辑器中的 {} 图标;)
  • 使用您在链接中提供的代码时,出现了什么问题?您可以使用该代码并向我们展示您遇到的问题吗?该代码对我来说似乎很清楚
  • 我尚未将我的代码转换为链接中提供的代码。我根本不知道如何或在哪里触发该代码中的多个异步任务。在里面的某个地方,我需要做类似TaskEx.WhenAll(tasks) 之类的事情,不是吗?

标签: c# asynchronous c#-5.0


【解决方案1】:

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

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

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

你想让它说 1 / 5 完成了吗?似乎 1/5 具有误导性,因为您可能快完成了?

但除此之外,the link you mentioned 应该涵盖您想要的内容。为什么它不起作用?

【讨论】:

  • 想象 0........12..43..5..(其余) ..1000 它仍然是相当线性的。所以我认为进度条还是很不错的。 return await wc.DownloadStringTaskAsyncEx( @"http://ancillaryasync.nickbutler.net/Murphy.ashx", progress );one 请求的异步方法调用。如果我做 1000 个这样的请求,它仍然是同步的。因为我等待每个电话完成。我找不到像TaskEx.WhenAll(tasks) 这样的方法。
  • 这些 cmets 的代码看起来很糟糕。对于那个很抱歉。我在这里很新。用“回答你的问题”来回答你的帖子可以吗?如果有人支持它,它会出现在您的帖子之前。那会令人困惑,不是吗?
  • @Schnerrus 当然,回答你自己的问题
【解决方案2】:

@McKay 和 craig1231: 你是对的。我在链接中提供的代码非常好,只是那里使用了旧的 AsyncCtpLib(嗯,该帖子于 2010 年底发布)。需要对代码进行一些修改。但我什至在问这个问题之前就解决了这个问题。

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

基本上,当您实例化此类 [Progress&lt;T&gt;,而不是 EventProgress&lt;T&gt;,因为新的 AsyncCtpLib 版本],它会捕获当前 线程的 SynchronizationContext。然后,每次从 在 TAP 方法中,它在 正确的线程。

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

【讨论】:

    猜你喜欢
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    相关资源
    最近更新 更多