Загружается только последний файл (Azure Blob) - PullRequest
0 голосов
/ 27 мая 2020

Я загружаю коллекцию файлов в blob параллельно (IFormFiles в C#).

Я использую семафор и TPL для параллельной загрузки. ( исходник )

Но все файлы, кроме последнего, загружаются только размером 64 Кб. Последний файл полностью загружен.

Я не знаю, почему размер блока 4 МБ игнорировался и использовался 64 КБ и почему загружается только 1 размер блока по умолчанию.

Вот код:

public static async Task UploadBulkAsync(string storageConnectionString, string containerName, Dictionary<string, IFormFile> blobNameToFile)
    {
        var completed = 0;
        var semaphore = new SemaphoreSlim(AppGlobalSettings.BulkUploadAzureBlobThreadCount, AppGlobalSettings.BulkUploadAzureBlobThreadCount);
        var tasks = new List<Task>();

        var options = new BlobRequestOptions
        {
            ParallelOperationThreadCount = 20
        };

        var blobContainer = await GetContainerAsync(storageConnectionString, containerName);
        await blobContainer.SetPermissionsAsync(new BlobContainerPermissions() { PublicAccess = BlobContainerPublicAccessType.Blob });

        foreach (var one in blobNameToFile)
        {
            var name = one.Key;
            var file = one.Value;

            var blockBlob = blobContainer.GetBlockBlobReference(name);
            blockBlob.Properties.ContentType = file.ContentType;

            await semaphore.WaitAsync();

            tasks.Add(blockBlob.UploadFromStreamAsync(file.OpenReadStream(), null, options, null).ContinueWith(t =>
            {
                semaphore.Release();
                Interlocked.Increment(ref completed);
            }));
        }

        await Task.WhenAll(tasks);
    }

1 Ответ

0 голосов
/ 01 июня 2020

Проблема была в коллекции объектов IFormFile. Вы не можете открыть несколько потоков IFormFile в одной обработке запроса. Их нужно обрабатывать последовательно.

ссылка: Получение сообщения «Позиция внутреннего потока неожиданно изменилась» в AWS Lambda

...