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

本文关键字:方法 一个 调用 错误 意外 时间 DownloadAsync | 更新日期: 2023-09-27 18:19:53

在我的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信息:最大数量的配额超过个并发操作
等待操作完成在开始新的项目之前
DownloadAsync错误。在调用了一个方法一个意想不到的时刻。

我想知道:

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

更新

现在,我把我的列表和链接到小列表的文件分开,并试图一个接一个地下载,但这并没有解决问题。当文件数量很小时(<20),也会引发此异常。

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

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

试着为每个做一个Parale.ForEach

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

编辑:试着用合适的数字更改50。