我正在尝试使用Amazon SDK
中的TransferUtility
类将多个文件上传到S3
.NET
我的想法是,由于开发工具包不允许一次从不同的文件夹上传多个文件,我会创建多个线程并上传到那里,但看起来 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);
}
}
看不出这里有什么问题吗?任何想法都非常感谢。
感谢
代码中的问题是你只是在构造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
});