public void PageBlobWriteStreamBasicTestAPM() { byte[] buffer = GetRandomBuffer(1024 * 1024); MD5 hasher = MD5.Create(); CloudBlobClient blobClient = GenerateCloudBlobClient(); blobClient.ParallelOperationThreadCount = 4; string name = GetRandomContainerName(); CloudBlobContainer container = blobClient.GetContainerReference(name); try { container.Create(); CloudPageBlob blob = container.GetPageBlobReference("blob1"); blob.StreamWriteSizeInBytes = buffer.Length; using (MemoryStream wholeBlob = new MemoryStream()) { BlobRequestOptions options = new BlobRequestOptions() { StoreBlobContentMD5 = true, }; using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { IAsyncResult result = blob.BeginOpenWrite(blobClient.ParallelOperationThreadCount * 2 * buffer.Length, null, options, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); using (Stream blobStream = blob.EndOpenWrite(result)) { IAsyncResult[] results = new IAsyncResult[blobClient.ParallelOperationThreadCount * 2]; for (int i = 0; i < results.Length; i++) { results[i] = blobStream.BeginWrite(buffer, 0, buffer.Length, null, null); wholeBlob.Write(buffer, 0, buffer.Length); Assert.AreEqual(wholeBlob.Position, blobStream.Position); } for (int i = 0; i < blobClient.ParallelOperationThreadCount; i++) { Assert.IsTrue(results[i].IsCompleted); } for (int i = blobClient.ParallelOperationThreadCount; i < results.Length; i++) { Assert.IsFalse(results[i].IsCompleted); } for (int i = 0; i < results.Length; i++) { blobStream.EndWrite(results[i]); } } } wholeBlob.Seek(0, SeekOrigin.Begin); string md5 = Convert.ToBase64String(hasher.ComputeHash(wholeBlob)); blob.FetchAttributes(); Assert.AreEqual(md5, blob.Properties.ContentMD5); using (MemoryStream downloadedBlob = new MemoryStream()) { blob.DownloadToStream(downloadedBlob); TestHelper.AssertStreamsAreEqual(wholeBlob, downloadedBlob); } } } finally { container.DeleteIfExists(); } }