.NET C#任务等待从AWS下载文件

wpcxdonn  于 2023-02-10  发布在  .NET
关注(0)|答案(1)|浏览(204)

我正在编写一个从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现在,它运行,它进行下载,但它不触发任何东西-在本例中是警报-当它完成时,它冻结了我的程序。
你能提供的任何建议都很感激。对此还很陌生。

tcomlyy6

tcomlyy61#

这就是问题所在:

task.Wait();

不应该在异步代码上使用阻塞等待,因为它可能导致死锁(您正在经历死锁,请查看Stephen Cleary的Don't Block on Async Code)。最好的方法是await任务:

var result = await AWSGET.DownloadAWSFile(...);

您还可以考虑在下载方法JIC中使用ConfigureAwait(false)

var success = await TransferMethods.DownloadSingleFileAsync(...).ConfigureAwait(false);

相关问题