C# 异步Amazon S3多部分上载的进度信息和部件号

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

我正在尝试使用多部分上载将文件上载到AmazonS3。我已将
列表
更改为
列表
,然后在其满时调用
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;
    …
}