在我的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错误。一种方法被称为 一个意想不到的时间。
我想知道:
现在,我将列表中的文件链接拆分为小列表,并尝试逐个下载,但它没有解决问题。 当文件数量很少(<20)时,也会抛出此异常。
答案 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。