Я загружаю коллекцию файлов в 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);
}