2

在我的 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 时,我有这样的例外:

MyApp.exe
WinRT 信息中发生了“System.InvalidOperationException”类型的第一次机会异常:超出了最大并发操作数的配额。
在开始新的操作之前等待操作完成。
下载异步错误。在意外的时间调用了一个方法。

我想知道:

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

更新

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

4

2 回答 2

1

尝试做一个 Paralel.ForEach

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

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

于 2013-07-18T14:53:51.937 回答
1

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

于 2013-07-12T23:32:10.593 回答