protected override void Dispose(bool disposing) { if (!PreventUploadComplete) { base.Dispose(disposing); FileHash = IOExtensions.GetAsHex(md5Hasher.TransformFinalBlock()); md5Hasher.Dispose(); } }
public async Task Execute() { while (true) { var read = await inputStream.ReadAsync(buffer).ConfigureAwait(false); TotalSizeRead += read; if (read == 0) // nothing left to read { FileHash = IOExtensions.GetAsHex(md5Hasher.TransformFinalBlock()); headers["Content-MD5"] = FileHash; storage.Batch(accessor => { accessor.CompleteFileUpload(filename); putTriggers.Apply(trigger => trigger.AfterUpload(filename, headers)); }); return; // task is done } int retries = 50; bool shouldRetry; do { try { storage.Batch(accessor => { var hashKey = accessor.InsertPage(buffer, read); accessor.AssociatePage(filename, hashKey, pos, read); putTriggers.Apply(trigger => trigger.OnUpload(filename, headers, hashKey, pos, read)); }); shouldRetry = false; } catch (ConcurrencyException) { if (retries-- > 0) { shouldRetry = true; Thread.Sleep(50); continue; } throw; } } while (shouldRetry); md5Hasher.TransformBlock(buffer, 0, read); pos++; } }