DownloadAsync错误。在意外的时间调用了一个方法

时间:2013-06-25 13:33:30

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

在我的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信息:最大数量的配额   并发操作超出。
等待操作完成   在开始新的之前。
下载Async错误。一种方法被称为   一个意想不到的时间。

我想知道:

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

    现在,我将列表中的文件链接拆分为小列表,并尝试逐个下载,但它没有解决问题。 当文件数量很少(<20)时,也会抛出此异常。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

尝试执行Parallel.ForEach

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

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