Amazon S3 - 传输实用程序在平行中不起作用

本文关键字:不起作用 实用程序 S3 传输 Amazon | 更新日期: 2023-09-27 18:36:06

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

看不出这里有什么问题吗?任何想法都非常感谢。
感谢

Amazon S3 - 传输实用程序在平行中不起作用

代码中的问题是你只是在构造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
});