[英]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.