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 の場合、次のような例外があります。

タイプ 'System.InvalidOperationException' の最初のチャンス例外が MyApp.exe
WinRT 情報で発生しました: 同時操作の最大数のクォータを超えました。
新しい操作を開始する前に、操作が完了するまで待ちます。
ダウンロード非同期エラー。予期しない時間にメソッドが呼び出されました。

私は知りたいです:

  1. なぜこうなった?
  2. リリースモードでこの問題は解決しましたか?
  3. いいえの場合、同時にダウンロードできるファイルの数は?
  4. 別の解決策を知っていますか(ファイルの一部をロードするだけでなく、次の部分をロードする....)

アップデート

今、小さなリストへのファイル リンクでリストを分割し、少しずつダウンロードしようとしていますが、問題は解決しません。ファイル数が少ない (<20) 場合、この例外もスローされます。

4

2 に答える 2

1

個人的に私がすることは、 List を作成してから、各ブロックを各スレッドで実行することです。そうすれば、制限を超えるスレッドはありません。多分スピードも上がる。必要に応じて、コードを提供できます。

于 2013-07-12T23:32:10.593 に答える
1

Parallel.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 に答える