Amazon S3 - 转移实用程序在paralel中不起作用

时间:2016-02-24 04:22:27

标签: c# .net multithreading amazon-s3 parallel-processing

我正在尝试使用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

1 个答案:

答案 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
});