我正在编写一个从AWS bucket下载一个100 mb文件的脚本,希望在下载完成后再继续。使用https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/dotnetv3/S3/scenarios/TransferUtilityBasics/TransferUtilityBasics/TransferMethods.cs这个脚本,我有以下代码作为我的函数:
public static async Task<string> DownloadAWSFile(string fileName, string filePath)
{
TransferUtility fileTransferUtility = new TransferUtility(s3Client);
var success = await TransferMethods.DownloadSingleFileAsync(fileTransferUtility, Config.AWS_BucketName, fileName, filePath);
if (success)
{
return "done";
}
else
{
return "error";
}
}
它由以下代码调用:
Task<string> task = AWSGET.DownloadAWSFile("filetodownload.zip", "C:\\path\\to\\download\\");
task.Wait();
if (task.Result == "done")
{
MessageBox.Show("Done Downloading", "Configuration", MessageBoxButton.OK, MessageBoxImage.Warning);
}
else
{
MessageBox.Show("Error", "Configuration", MessageBoxButton.OK, MessageBoxImage.Warning);
}
下载代码本身运行良好。2我单击运行AWSGET.DOwnloadAWSFile函数的按钮,它运行良好。3一旦我使该函数工作,我就将该函数更改为一个任务,如上图所示。4现在,它运行,它进行下载,但它不触发任何东西-在本例中是警报-当它完成时,它冻结了我的程序。
你能提供的任何建议都很感激。对此还很陌生。
1条答案
按热度按时间tcomlyy61#
这就是问题所在:
不应该在异步代码上使用阻塞等待,因为它可能导致死锁(您正在经历死锁,请查看Stephen Cleary的Don't Block on Async Code)。最好的方法是
await
任务:您还可以考虑在下载方法JIC中使用
ConfigureAwait(false)
: