C# Amazon S3 TransferUtility.Upload挂起在C中#
因此,我正在编写一个迁移应用程序,从本地存储中获取一些数据并将其上传到Amazon。一切正常,除了当我进入大于15兆的文件(兆,是的,不是千兆)时,应用程序冻结 这是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
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上设置流属性,而不是文件名属性。