using System.Collections.Generic;
using System.Diagnostics;
static async System.Threading.Tasks.Task Main()
CreateArchiveAsync().Wait();
var swSync = System.Diagnostics.Stopwatch.StartNew();
var syncHash = CreateArchiveSync();
var swAsync = System.Diagnostics.Stopwatch.StartNew();
var asyncHash = await CreateArchiveAsync();
if (syncHash != asyncHash)
throw new Exception("HASH MISMATCH");
System.Console.WriteLine("Sync: " + swSync.ElapsedMilliseconds);
System.Console.WriteLine("Async: " + swAsync.ElapsedMilliseconds);
private static async System.Threading.Tasks.Task<string> CreateArchiveAsync()
using (var stream = new System.IO.MemoryStream())
using (var archive = new System.IO.Compression.ZipArchive(stream, System.IO.Compression.ZipArchiveMode.Update, true))
var lstTask = new System.Collections.Generic.List<System.Threading.Tasks.Task>();
for (int i = 50; i >= 0; i--)
lstTask.Add(CreateEntryAsync(archive, i));
await System.Threading.Tasks.Task.WhenAll(lstTask);
return SHA256Hash(stream);
private static string CreateArchiveSync()
using (var stream = new System.IO.MemoryStream())
using (var archive = new System.IO.Compression.ZipArchive(stream, System.IO.Compression.ZipArchiveMode.Update, true))
for (int i = 50; i >= 0; i--)
CreateEntryAsync(archive, i).Wait();
return SHA256Hash(stream);
private static async System.Threading.Tasks.Task CreateEntryAsync(System.IO.Compression.ZipArchive archive, int i)
var entry = archive.CreateEntry(System.Guid.NewGuid().ToString() + i + ".txt");
using (var entryStream = entry.Open())
await System.Threading.Tasks.Task.Delay(i);
var t = Encoding.UTF8.GetBytes("Test" + i);
await entryStream.WriteAsync(t, 0, t.Length);
private static string SHA256Hash(Stream stream)
using (var s = new BufferedStream(stream, 1200000))
var sha = new System.Security.Cryptography.SHA256Managed();
byte[] checksum = sha.ComputeHash(s);
return BitConverter.ToString(checksum).Replace("-", String.Empty);