c#将文件写入S3,然后删除本地文件

c#将文件写入S3,然后删除本地文件,c#,amazon-s3,delete-file,C#,Amazon S3,Delete File,下面的程序从web服务提取数据并将其写入csv,将文件上载到S3,然后将其删除。我遇到的问题是,它无法删除该文件,因为它显示“System.IO.IOException:”进程无法访问文件“file.csv”,因为它正被另一个进程使用。“,我猜它尚未完成对S3的写入,因为它没有显示在那里。有什么建议吗 在这里,我关闭文件,上传到S3,然后尝试删除 outputFile.Flush(); outputFile.Close(); AmazonS3Uploader awsfu = new Amazon

下面的程序从web服务提取数据并将其写入csv,将文件上载到S3,然后将其删除。我遇到的问题是,它无法删除该文件,因为它显示“System.IO.IOException:”进程无法访问文件“file.csv”,因为它正被另一个进程使用。“,我猜它尚未完成对S3的写入,因为它没有显示在那里。有什么建议吗

在这里,我关闭文件,上传到S3,然后尝试删除

outputFile.Flush();
outputFile.Close();
AmazonS3Uploader awsfu = new AmazonS3Uploader();
awsfu.UploadFile(outputfilePath, "api-end-point", filenameaws);
System.IO.File.Delete(@outputfilePath);
下面是S3上传的代码

class AmazonS3Uploader
{
    public void UploadFile(string filePath, string bucketName, string keyName)
    {
        var client1 = new AmazonS3Client(Amazon.RegionEndpoint.USEast2);
        Console.WriteLine("s3 writing");
        try
        {
            PutObjectRequest Request = new PutObjectRequest
            {
                BucketName = bucketName,
                Key = keyName,
                FilePath = filePath,
            };

            client1.PutObjectAsync(Request);
        }
        catch (AmazonS3Exception amazonS3Exception)
        {
            if (amazonS3Exception.ErrorCode != null &&
                (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId")
                ||
                amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
            {
                throw new Exception("Check the provided AWS Credentials.");
            }
            else
            {
                throw new Exception("Error occurred: " + amazonS3Exception.Message);
            }
        }
        //System.IO.File.Delete(@filePath); edit

    }
}

您正在调用一个异步方法,而不是等待它完成

正如政府所说:

[PutObjectAsync]启动PutObject操作的异步执行

因为您没有等待该方法完成,所以代码将继续并在文件仍在上载时尝试删除该文件(两次!)

解决此问题的最简单方法是更改代码以使用:


假设
PutObjectAsync
是异步的,您调用的是异步方法,而不是等待它完成。您还尝试删除文件两次,一次是在
UploadFile
方法的末尾,然后在它返回后再次删除。我在示例代码中执行了两次,因为我一直在围绕语句尝试修复它。如果我理解异步方法,即使程序没有完成任务,它们也允许程序继续运行,对吗?因此,如果它不是异步的,它可能会减慢代码的速度,对吗?--也许我需要为这一个启动一个新线程,但是我的S3存储桶中没有显示任何内容,有什么想法吗?没关系,对象显示在S3中。感谢您的帮助,如果您能对异步方法和性能做一些澄清,我们将不胜感激。
client1.PutObject(Request);