C# 异步Amazon S3多部分上载的进度信息和部件号
我正在尝试使用多部分上载将文件上载到AmazonS3。我已将C# 异步Amazon S3多部分上载的进度信息和部件号,c#,asynchronous,amazon-web-services,amazon-s3,task-parallel-library,C#,Asynchronous,Amazon Web Services,Amazon S3,Task Parallel Library,我正在尝试使用多部分上载将文件上载到AmazonS3。我已将列表更改为列表,然后在其满时调用Task.WaitAll(myList.ToArray) 唯一的问题是,当我将进度事件添加到每个UploadPartRequest对象时,我无法确定哪个部分在向我反馈信息(因为它们都同时反馈!)。我可以同步上传并跟踪当前上传的部件号,但这并不理想,因为它显然要慢得多 有人知道在异步上传过程中如何获取UploadPartRequest的PartNumber?老实说,它看起来真的不像(StreamTransf
列表
更改为列表
,然后在其满时调用Task.WaitAll(myList.ToArray)
唯一的问题是,当我将进度事件添加到每个UploadPartRequest
对象时,我无法确定哪个部分在向我反馈信息(因为它们都同时反馈!)。我可以同步上传并跟踪当前上传的部件号,但这并不理想,因为它显然要慢得多
有人知道在异步上传过程中如何获取UploadPartRequest
的PartNumber
?老实说,它看起来真的不像(StreamTransferProgressArgs没有信息,似乎是唯一的方法),但我想我应该扔掉这个网,看看我能抓到什么
更新
以下是我的代码片段:
private void MultiPartUpload(string localUNC, string destinationUNC)
{
var uploadResponses = new List<UploadPartResponse>();
var initiateRequest = new InitiateMultipartUploadRequest
{
BucketName = _bucket,
Key = destinationUNC
};
var response = _s3.InitiateMultipartUpload(initiateRequest);
var contentLength = new FileInfo(localUNC).Length;
try
{
long filePosition = 0;
for (TotalParts = 1; filePosition < contentLength; )
{
TotalParts++;
filePosition += PartSize;
}
filePosition = 0;
for (CurrentPart = 1; filePosition < contentLength; )
{
var uploadRequest = new UploadPartRequest()
{
BucketName = _bucket,
Key = destinationUNC,
UploadId = response.UploadId,
PartNumber = CurrentPart,
PartSize = PartSize,
FilePosition = filePosition,
FilePath = localUNC
};
uploadRequest.StreamTransferProgress +=
new EventHandler<StreamTransferProgressArgs>(OnPartUploadProgressUpdate);
uploadResponses.Add(_s3.UploadPart(uploadRequest));
filePosition += PartSize;
CurrentPart++;
}
var completeRequest = new CompleteMultipartUploadRequest()
{
BucketName = _bucket,
Key = destinationUNC,
UploadId = response.UploadId
};
var completeResponse = _s3.CompleteMultipartUpload(completeRequest);
}
catch (Exception e)
{
Console.WriteLine("Error during multi-part upload: {0}", e.Message);
var abort = new AbortMultipartUploadRequest()
{
BucketName = _bucket,
Key = destinationUNC,
UploadId = response.UploadId
};
_s3.AbortMultipartUpload(abort);
}
}
ConvertByte
类是我自己创建的。我在注释掉的代码中留下了内容,这样您就可以看到我尝试的内容。您可以将事件处理程序设置为lambda,它可以访问uploadRequest
局部变量:
uploadRequest.StreamTransferProgress +=
(_, e) => OnPartUploadProgressUpdate(uploadRequest, e);
…
static void OnPartUploadProgressUpdate(
UploadPartRequest request, StreamTransferProgressArgs e)
{
var partNumber = request.PartNumber;
…
}
事件处理程序的
sender
参数不是它所属的UploadPartRequest
吗?尝试强制转换它,然后访问它的零件号
。否。这个对象就是AmazonS3Client
对象,我认为它在识别上传的部分时是无用的。这是非常令人沮丧的,我真的觉得要么我错过了一些简单的东西,要么亚马逊把一些简单的东西搞糟了……在这种情况下,我认为最好的解决方案是使用lambda。如果您发布代码(我不太明白您到底是如何修改该示例的),我可以告诉您我的确切意思。@svick:Done。谢谢那真有魅力!不过,我对自己没有想到这一点感到沮丧。好吧。你活着,你学习!
uploadRequest.StreamTransferProgress +=
(_, e) => OnPartUploadProgressUpdate(uploadRequest, e);
…
static void OnPartUploadProgressUpdate(
UploadPartRequest request, StreamTransferProgressArgs e)
{
var partNumber = request.PartNumber;
…
}