我正在尝试使用S3
上的TransferUtility
类将Amazon SDK
上传多个文件.NET
我的想法是,既然SDK不允许同时从不同文件夹上传多个文件,我会创建多个线程并上传到那里,但看起来Amazon SDK对此有一些检查,因为我没有注意到我上传方法的任何并行执行。
这是我正在使用的伪代码:
int totalUploaded = 0;
foreach (var dItem in Detection.Items.AsParallel())
{
UploadFile(dItem);
totalUploaded++;
Action a = () => { lblStatus.Text = $"Uploaded {totalUploaded} from {Detection.ItemsCount}"; };
BeginInvoke(a);
}
我正在使用.AsParallel
来生成多个线程。我的CPU(i7-5930K
)有6个内核并支持多线程,因此AsParallel
必须根据需要生成更多线程。
这是上传方法
private void UploadFile(Detection.Item item)
{
Debug.WriteLine("Enter " + item.FileInfo);
Interlocked.Increment(ref _threadsCount);
...
using (var client = AmazonS3Client)
{
....
// if we are here we need to upload
TransferUtilityUploadRequest request = new TransferUtilityUploadRequest
{
Key = s3Key,
BucketName = settings.BucketName,
CannedACL = S3CannedACL.PublicRead,
FilePath = item.FileInfo.FullName,
ContentType = "image/png",
};
TransferUtility utility = new TransferUtility(client);
utility.Upload(request);
}
}
不知道这里有什么不对吗?任何想法都高度赞赏。
THX
答案 0 :(得分:2)
您的代码中的问题是您只构建ParallelEnumerable
,但将其视为简单的IEnumerable
:
foreach (var dItem in Detection.Items.AsParallel())
这部分代码只是迭代收集。如果您希望并行执行,则必须使用扩展方法ForAll()
:
Detection.Items.AsParallel().ForAll(dItem =>
{
//Do parallel stuff here
});
您也可以简单地使用Parallel
类:
Parallel.ForEach(Detection.Items, dItem =>
{
//Do parallel stuff here
});