Adicionei um novo recurso a um dos meus aplicativos Blazor. Isso permite o upload de arquivos para o armazenamento de blobs em blocos. Isso funciona muito bem. Dei uma olhada para processar memória no Visual Studio. Onde meu aplicativo tinha o tempo todo 80 MB, com todas as suas coisas. Mas quando inicio um upload, vejo que o consumo de memória aumenta em 10-20 MB e não volta. Também aumenta a cada upload de um arquivo. Observe que eu carrego arquivos em blocos de 10 MB, antes eu tinha 100 MB e aumentou 100-200 MB. Então agora não tenho certeza se é vazamento de memória (acho que é) ou se o gc demora muito.
aqui minha função de dentro do serviço para referência
public async Task UploadFileToBlobStorage(Stream stream, string fileName, string containerName,string contentType,IProgress<long> progress,CancellationToken cancellationToken)
{
_logger.LogInformation($"Uploading file {fileName} to container {containerName}");
var blobServiceClient = new BlobServiceClient(new Uri($"https://{accountName}.blob.core.windows.net"), new DefaultAzureCredential());
var containerClient = blobServiceClient.GetBlobContainerClient(containerName);
await containerClient.CreateIfNotExistsAsync(cancellationToken:cancellationToken);
var blockblobClient = containerClient.GetBlockBlobClient(fileName);
var blockIds = new List<string>();
var buffer = new byte[10 * 1024 * 1024]; // 10 MB
int bytesRead;
int blockNumber = 0;
long totalBytesRead = 0;
var blobHttpHeader = new BlobHttpHeaders
{
ContentType = contentType,
ContentDisposition = $"attachment; filename={fileName}",
};
while ((bytesRead = await stream.ReadAsync(buffer.AsMemory( 0, buffer.Length), cancellationToken)) > 0)
{
var blockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(blockNumber.ToString("d6")));
blockIds.Add(blockId);
using (var blockStream = new MemoryStream(buffer, 0, bytesRead))
{
await blockblobClient.StageBlockAsync(blockId, blockStream,cancellationToken: cancellationToken);
}
totalBytesRead += bytesRead;
progress?.Report(totalBytesRead);
blockNumber++;
}
await blockblobClient.CommitBlockListAsync(blockIds,httpHeaders:blobHttpHeader,cancellationToken:cancellationToken);
_logger.LogInformation($"File {fileName} uploaded to container {containerName} successfull");
}
O fluxo variável que é passado para a função é um ibrowserfile que foi criado usando
using var stream = _selectedFile.OpenReadStream(maxAllowedSize: long.MaxValue);
Ficarei feliz em receber dicas.
- Alguém vê algum erro grave?
- Talvez não haja engano e minha interpretação esteja errada?
Muito obrigado