C# 下载异步错误。在意外时间调用了一个方法

C# 下载异步错误。在意外时间调用了一个方法,c#,windows-8,windows-runtime,download,C#,Windows 8,Windows Runtime,Download,在我的Windows8(c#)应用程序中,我使用这种结构下载文件 var tasksDownload = listLinks.Select(link => DownloadAsync(new Uri(link, UriKind.RelativeOrAbsolute), folder, fileName)).ToArray(); await Task.WhenAll(tasksDownload); public static async Task DownloadA

在我的Windows8(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信息:最大数量的配额 超过并发操作的个数。
等待操作完成 在开始新的下载之前。
下载异步错误。在上调用了一个方法 意外的时刻

我想知道:

  • 为什么会这样
  • 释放模式解决了这个问题
  • 如果没有,我可以同时下载多少文件
  • 您知道另一种解决方案吗(不仅加载部分文件,然后加载下一部分…)
  • 更新 现在,我将我的列表与小列表的文件链接分开,并尝试逐段下载,但这并没有解决问题。
    当文件数量较少时(我个人会做的是创建一个列表,然后在每个线程上运行每个块。这样,所有线程都不会超过限制。也可能会提高速度。如果需要,我可以提供代码。

    尝试执行Paralel.ForEach

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

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

    您可以重新使用
    BackgroundDownloader
    s。我知道,但我有问题:为什么会发生这种情况?发布模式解决了这个问题?如果没有,我可以同时下载多少文件?您知道另一种解决方案吗(不仅加载部分文件,然后加载下一部分…)例外情况非常明显。一个进程可以使用的并发量有一定的配额。您可能可以对并发性进行基准测试并找出它。解决方案是找出限制并遵守它(将文件排队等待下载).是的,但我需要知道准确的配额以及它取决于什么?我已经阅读了官方(或非官方)的源代码,以确保我的代码。谁知道,可能取决于处理器型号或其他…好吧,它没有任何文档记录,所以你可能会在MSDN论坛上或通过电子邮件向WinRT产品所有者之一发送更好的运气。