C# 亚马逊S3-传输工具赢得';我不能并行工作
我正在尝试使用C# 亚马逊S3-传输工具赢得';我不能并行工作,c#,.net,multithreading,amazon-s3,parallel-processing,C#,.net,Multithreading,Amazon S3,Parallel Processing,我正在尝试使用amazonsdkfor.NET中的TransferUtility类将多个文件上载到S3 我的想法是,由于SDK不允许同时上传来自不同文件夹的多个文件,我会创建多个线程并上传到那里,但Amazon SDK似乎对此进行了某种检查,因为我没有注意到我上传方法的任何并行执行 下面是我正在使用的伪代码: int totalUploaded = 0; foreach (var dItem in Detection.Items.AsParallel()) { UploadFile(dI
amazonsdk
for.NET
中的TransferUtility
类将多个文件上载到S3
我的想法是,由于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代码中的问题是,您只构建了
并行可枚举
,但将其视为一个简单的IEnumerable
:
foreach (var dItem in Detection.Items.AsParallel())
这部分代码只是在集合上迭代。如果希望执行并行,则必须使用扩展方法:
您也可以简单地使用该类:
哦,哇,我已经使用这种构造很长时间了,我一直认为foreach会在更多线程中转换,真是个傻瓜:)谢谢你,现在它可以根据需要工作了。不,不幸的是,它提供了一个并行执行下一个
LINQ
扩展方法的机会。祝你好运,别忘了换其他类似建筑的地方!
Detection.Items.AsParallel().ForAll(dItem =>
{
//Do parallel stuff here
});
Parallel.ForEach(Detection.Items, dItem =>
{
//Do parallel stuff here
});