private async Task CopyStreamToBlobAsync(Stream sourceStream, BlobContainerClient container, string blobName, int bufferSize, string sourceMD5, CancellationToken cancellationToken) { var blob = container.GetBlockBlobClient(blobName); var blobHasher = CopyUtils.GetMD5Hasher(); var blockIDs = new List <string>(); var blockNumber = 0; await CopyUtils.CopyAsync( (buffer, ct) => CopyUtils.ReadStreamMaxBufferAsync(buffer, sourceStream, ct), async (buffer, count, cancellationToken2) => { var blockId = GetBlockId(blockNumber); blockIDs.Add(blockId); var blockMD5Hash = CopyUtils.GetMD5Hash(buffer, 0, count); CopyUtils.AppendMDHasherData(blobHasher, buffer, 0, count); using (var ms = new MemoryStream(buffer, 0, count)) { await blob.StageBlockAsync(blockId, ms, blockMD5Hash, null, null, cancellationToken); } blockNumber++; }, bufferSize, cancellationToken ); var blobHash = CopyUtils.GetMD5Hash(blobHasher); if ((!string.IsNullOrEmpty(sourceMD5)) && (sourceMD5 != CopyUtils.GetMD5HashString(blobHash))) { throw new Exception("Invalid destination MD5"); } var headers = new global::Azure.Storage.Blobs.Models.BlobHttpHeaders() { ContentHash = blobHash }; await blob.CommitBlockListAsync(blockIDs, headers, null, null, null, cancellationToken); }