簡體   English   中英

C#Task.WaitAll沒有等待

[英]C# Task.WaitAll isn't waiting

我的目標是從Amazon Web Services存儲桶下載圖像。

我有以下代碼功能,可以一次下載多個圖像:

public static void DownloadFilesFromAWS(string bucketName, List<string> imageNames)
{
    int batchSize = 50;
    int maxDownloadMilliseconds = 10000;

    List<Task> tasks = new List<Task>();

    for (int i = 0; i < imageNames.Count; i++)
    {
        string imageName = imageNames[i];
        Task task = Task.Run(() => GetFile(bucketName, imageName));
        tasks.Add(task);
        if (tasks.Count > 0 && tasks.Count % batchSize == 0)
        {
            Task.WaitAll(tasks.ToArray(), maxDownloadMilliseconds);//wait to download
            tasks.Clear();
        }
    }

    //if there are any left, wait for them
    Task.WaitAll(tasks.ToArray(), maxDownloadMilliseconds);
}

private static void GetFile(string bucketName, string filename)
{
    try
    {
        using (AmazonS3Client awsClient = new AmazonS3Client(Amazon.RegionEndpoint.EUWest1))
        {
            string key = Path.GetFileName(filename);

            GetObjectRequest getObjectRequest = new GetObjectRequest() {
                 BucketName = bucketName,
                    Key = key
            };

            using (GetObjectResponse response = awsClient.GetObject(getObjectRequest))
            {
                string directory = Path.GetDirectoryName(filename);
                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }

                if (!File.Exists(filename))
                {
                    response.WriteResponseStreamToFile(filename);
                }
            }
        }
    }
    catch (AmazonS3Exception amazonS3Exception)
    {
        if (amazonS3Exception.ErrorCode == "NoSuchKey")
        {
            return;
        }
        if (amazonS3Exception.ErrorCode != null && (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId") || amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
        {
            // Log AWS invalid credentials
            throw new ApplicationException("AWS Invalid Credentials");
        }
        else
        {
            // Log generic AWS exception
            throw new ApplicationException("AWS Exception: " + amazonS3Exception.Message);
        }
    }
    catch
    {
        //
    }
}

下載的圖像都運行正常,但Task.WaitAll似乎被忽略,其余代碼繼續執行 - 這意味着我嘗試獲取當前不存在的文件(因為它們尚未下載)。

我找到了另一個問題的答案, 這個問題似乎跟我的一樣。 我嘗試使用答案來更改我的代碼,但它仍然不會等待所有文件下載。

誰能告訴我哪里出錯了?

代碼表現如預期。 即使沒有下載所有文件, Task.WaitAll在十秒后返回,因為您已在變量maxDownloadMilliseconds指定了10秒(10000毫秒)的maxDownloadMilliseconds

如果您真的想等待所有下載完成,請調用Task.WaitAll而不指定超時。

使用

Task.WaitAll(tasks.ToArray());//wait to download

在這兩個地方。

要查看有關如何實現並行下載而不強調系統(僅具有最大並行下載次數)的一些很好的解釋,請參閱如何限制Parallel.ForEach的答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM