//exception boundary: chunk upload exceptions should be propagated to here but no farther private Task <PartUploadResult> AttemptPartUploadWithRetry(Func <FilePart, Task> attemptUpload, FilePart part, int retryCount) { if (retryCount < 0) { return(TaskFromResult(PartUploadResult.Error)); } return(attemptUpload(part).ContinueWith(uploadTask => { if (uploadTask.Exception != null) { // Always back out progress if part fails updateProgress(part.Length * -1); if (retryCount > 0) { return AttemptPartUploadWithRetry(attemptUpload, part, retryCount - 1).Result; } else { return PartUploadResult.Exception(uploadTask.Exception.Unwrap()); } } else { return PartUploadResult.Success; } })); }
public async Task <PartUploadResult> UploadPartAsync(string bucketName, string objectKey, string uploadId, uint partNumber, byte[] partBytes) { using (var partUploadResult = await Task.Run(() => SWIG.storj_uplink.uplink_upload_part(_access._project, bucketName, objectKey, uploadId, partNumber)).ConfigureAwait(false)) { PartUploadResult result = new PartUploadResult(partUploadResult.part_upload); if (partUploadResult.error != null && !string.IsNullOrEmpty(partUploadResult.error.message)) { result.Error = partUploadResult.error.message; } else { try { result.BytesWritten = await Task.Run(() => DoUnsafeUpload(partUploadResult.part_upload, objectKey, partBytes)).ConfigureAwait(false); } catch (Exception ex) { result.Error = ex.Message; } } return(result); } }