C#Task.WaitAll不在等待

珀西

我的目的是从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即使未下载所有文件,十秒后仍会返回,因为您在variable中指定了10秒(10000毫秒)的超时时间maxDownloadMilliseconds

如果您确实要等待所有下载完成,请致电Task.WaitAll而不指定超时。

使用

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

在两个地方。

要查看有关如何实现并行下载而不给系统造成压力(仅具有最大并行下载数量)的一些好的说明,请参阅如何限制Parallel.ForEach的答案

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Task.WaitAll()处理等待的任务?

来自分类Dev

任务等待vs Task.WaitAll

来自分类Dev

任务等待vs Task.WaitAll

来自分类Dev

Task.WaitAll没有在等待-解释

来自分类Dev

如何对C#Task Factory进行多重处理

来自分类Dev

SynchronizationContext在Task.Run上流动,但不在等待中流动

来自分类Dev

C#中的Task.WaitAll挂起了任务的执行

来自分类Dev

C#中的Task.WaitAll挂起了任务的执行

来自分类Dev

C#Task.WaitAll()取消,进行错误处理

来自分类Dev

Task.WaitAll()的默认超时

来自分类Dev

Task.WaitAll is not waiting - Explanation

来自分类Dev

分别等待IEnumerable <Task <T >> C#

来自分类Dev

scanf(“%c”,x)和x = getchar都不在等待输入

来自分类Dev

等待而不在Livecode中等待?

来自分类Dev

异步等待与TaskFactory.StartNew和WaitAll

来自分类Dev

在WCF方法中使用Task.WaitAll

来自分类Dev

Task.WaitAll()无法正常工作

来自分类Dev

Task.WaitAll无限期阻止

来自分类Dev

C#Task.WaitAll()如何将对象状态组合为一个?

来自分类Dev

等待Task.Run与等待

来自分类Dev

C#如何等待返回Task <dynamic>的方法?

来自分类Dev

异步/等待与Task.Run在C#中

来自分类Dev

是否在C#.NET中等待Task.WhenAll阻塞?

来自分类Dev

C# Task.Delay 启动前的等待期

来自分类Dev

“ foreach with task.Wait”和Task.WaitAll之间的区别

来自分类Dev

“ foreach with task.Wait”和Task.WaitAll之间的区别

来自分类Dev

等待或Task.FromResult

来自分类Dev

无法等待Task <MyObject>

来自分类Dev

为什么Task.WaitAll不等到我的所有任务都完成后才开始?C#