C# Amazon S3 TransferUtility.Upload挂起在C中#

C# Amazon S3 TransferUtility.Upload挂起在C中#,c#,.net,amazon-s3,C#,.net,Amazon S3,因此,我正在编写一个迁移应用程序,从本地存储中获取一些数据并将其上传到Amazon。一切正常,除了当我进入大于15兆的文件(兆,是的,不是千兆)时,应用程序冻结 这是C#,非常简单 var transferRequest = new TransferUtilityUploadRequest { Key = firstKey, FilePath = fileName, BucketName = ContentBucket, T

因此,我正在编写一个迁移应用程序,从本地存储中获取一些数据并将其上传到Amazon。一切正常,除了当我进入大于15兆的文件(兆,是的,不是千兆)时,应用程序冻结

这是C#,非常简单

var transferRequest = new TransferUtilityUploadRequest
    {
        Key = firstKey,
        FilePath = fileName,
        BucketName = ContentBucket,
        Timeout = 3600000,
        ContentType = GetContentTypeForFileExtension(fileName)
    };

transferRequest.UploadProgressEvent += DisplayFileProgress;
transferUtil.Upload(transferRequest);
正如我所说,对于15兆或更小的文件,它可以正常工作……但对于更大的文件,它只是停止并永远处于“上传”命令中。15兆需要40秒,所以我预计30兆的测试文件需要2分钟…但10分钟后,没有爱

任何建议都将不胜感激,因为不幸的是,我将处理大量大小为50+兆的文件

请注意,如果我在VisualStudio.net中的AWS资源管理器中,我可以手动上载50+兆的文件,而不会出现任何问题,而且速度相对较快


所以这是“有趣的”…在进一步审查,我的50兆文件上传刚刚好。这是我附加到UploadProgressEvent的代码,它实际上导致事情冻结,因为如果我将其注释掉,那么50meg文件将毫无问题地上传

如果我把这段代码留在里面,15个meg文件会在进度条上显示它们的进度。但任何超过15兆的数据都会导致整个应用程序冻结。谁能告诉我处理进度条更新的代码有什么问题吗

private void DisplayFileProgress(object sender, UploadProgressArgs args)
{
    pbFileProgress.Invoke((MethodInvoker)delegate { 
        pbFileProgress.Value = args.PercentDone; 
        pbFileProgress.Refresh(); }); 
}

我只是设置“
transferRequest.UploadProgressEvent+=DisplayFileProgress
”。就像我说的,奇怪的是,这对较小的文件很有效,但对较大的文件却会锁定所有文件。

DisplayFileProgress是线程安全的吗?我相信(查看一些旧代码)回调是由每个上传线程独立调用的

下面的代码是一个小实用程序的一部分,我们使用它上载从5MB到1-2GB左右的文件。这和你的没什么不同,但也许会有帮助

var writerlock = new object();

using (var tu = new TransferUtility(amazonS3Client, tuconfig))
{
    var turequest = new TransferUtilityUploadRequest()
        .WithBucketName(bucket)
        .WithFilePath(file)
        .WithKey(Path.GetFileName(file))
        .WithStorageClass(S3StorageClass.ReducedRedundancy)
        .WithPartSize(5 * 1024 * 1024)
        .WithAutoCloseStream(true)
        .WithCannedACL(S3CannedACL.PublicRead);

    tuconfig.NumberOfUploadThreads = Environment.ProcessorCount - 1;

    // show progress information if not running batch
    if (interactive)
    {
        turequest.UploadProgressEvent += (s, e) =>
                                          {
                                              lock (writerlock)
                                              {
                                                  ... our progress routine ...
                                              }
                                          };
    }

    tu.Upload(turequest);
}

尝试使用BeginUpload方法而不是上载

        transferUtility.BeginUpload(request, new AsyncCallback(uploadComplete), null );
    }
    private void uploadComplete(IAsyncResult result)
    {
        var x = result;
    }

像以前一样设置传输实用程序和UploadProgressEvent。在进度处理程序中使用Invoke方法。如果使用BeginUpdate()而不是Update(),则会阻止应用程序挂起对表单的第一次更新。我在任何地方都找不到此解决方案,因此我希望它对您有效。

出于兴趣,您是否尝试过通过流而不是文件上传?这显然会阻碍异步上传块的能力。我很想知道这是否有效。我还没有试过,不知道如何设置……我想我会在周一深入研究。虽然看起来30兆的文件不应该带来任何困难,是吗?不,当然不应该。但是如果你读到S3论坛,你会发现很多人都有类似的问题。碰巧的是,我的NAS系统的软件也无法处理将>10MB的文件上传到S3的问题,而Cloudberry软件处理得很好。我认为您需要做的只是使用File.open打开流,然后在TransferUtilityUploadRequest上设置流属性,而不是文件名属性。