【问题标题】:DownloadAsync error. A method was called at an unexpected time下载异步错误。在意外的时间调用了一个方法
【发布时间】:2013-07-18 22:53:51
【问题描述】:

在我的 Windows 8 (c#) 应用程序中,我使用这种结构来下载文件。

  var tasksDownload = listLinks.Select(link => DownloadAsync(new Uri(link, UriKind.RelativeOrAbsolute), folder, fileName)).ToArray();
        await Task.WhenAll(tasksDownload);

  public static async Task DownloadAsync(Uri fileUri, StorageFolder folder, string fileName)
    {
        try
        {
            var file = await folder.CreateFileAsync(fileName);
            var downloader = new BackgroundDownloader();
            var download = downloader.CreateDownload(fileUri, file);
            await download.StartAsync();
        }
        catch (InvalidOperationException e)
        {
            Debug.WriteLine("DownloadAsync error.  " + e.Message);
        }
    }

但是,当文件数为 1123 时,我有这样的例外:

“System.InvalidOperationException”类型的第一次机会异常 发生在 MyApp.exe
WinRT 信息:Quota for maximum number 超出并发操作数。
等待操作完成 在开始新的之前。
DownloadAsync 错误。调用了一个方法 一个意想不到的时间。

我想知道:

  1. 为什么会这样?
  2. 发布模式解决了这个问题?
  3. 如果不是,我可以同时下载多少个文件?
  4. 您知道另一种解决方案吗(不仅加载部分文件,然后加载下一部分....)

更新

现在,我将列表与指向小列表的文件链接分开,并尝试逐个下载,但这并没有解决问题。 当文件数量很少(

【问题讨论】:

  • 你可以重复使用BackgroundDownloaders。
  • 我知道,但我对此有疑问:为什么会这样?发布模式解决了这个问题?如果不是,我可以同时下载多少个文件?您知道另一种解决方案吗(不仅加载部分文件,然后加载下一部分....)
  • 异常非常明确。一个进程可以使用的并发量有一些配额。您可能可以对并发性进行基准测试并找出答案。解决方案是找出限制并坚持下去(将文件排队以供下载)。
  • 是的,但我需要知道准确的配额以及它取决于什么?我已经阅读了官方(或非)来源,以确保在我的代码中。谁知道呢,可能取决于处理器型号或其他...
  • 好吧,它没有在任何地方记录,因此您可能会在 MSDN 论坛上获得更好的运气或向其中一位 WinRT 产品所有者发送电子邮件。

标签: c# windows-8 windows-runtime download


【解决方案1】:

就我个人而言,我要做的是创建一个 List ,然后在每个线程上运行每个块。这样所有线程都不会超过限制。也可能会提高速度。如果需要,我可以提供代码。

【讨论】:

    【解决方案2】:

    尝试做一个 Paralel.ForEach

    Parallel.ForEach(listLinks, new ParallelOptions { MaxDegreeOfParallelism = 50 }, (link) =>
    {
        DownloadAsync(new Uri(link, UriKind.RelativeOrAbsolute), folder, fileName).Wait();
    });
    

    编辑:尝试将 50 更改为适当的数字。

    【讨论】:

      猜你喜欢
      • 2020-11-04
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      相关资源
      最近更新 更多