我将文件集合以并行方式(在C#中为IFormFiles)上传到blob。
我使用信号量和TPL进行并行上传。 (source)
但是除了最后一个文件以外的所有文件仅以64 Kb的速度上传。最新文件已完全上传。
我不知道为什么忽略4Mb的块大小并使用64Kb,为什么只上传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);
}
问题出在IFormFile对象的集合中。您不能在同一请求处理中打开多个IFormFile流。它们需要按顺序处理。
链接:Getting "The inner stream position has changed unexpectedly" in AWS Lambda