protected override async Task StartPrivateAsync() { try { OnTotalFilesRemainChanged(1); switch (Status) { case NetworkStatus.ErrorNeedRestart: case NetworkStatus.NotStarted: case NetworkStatus.Paused: { if (Status != NetworkStatus.Paused) { //Status = NetworkStatus.Starting; //MyLogger.Assert(downloader == null && windowsFile == null && fileStream == null); if (fileStream != null) { fileStream.Dispose(); fileStream = null; } fileStream = await windowsFile.OpenStreamForReadAsync(); uploader = new RestRequests.Uploader(new List <string> { CloudFolder.Id }, fileStream, fileName); } Status = NetworkStatus.Networking; var progressChangedEventHandler = new RestRequests.ProgressChangedEventHandler((bytesProcessed, totalLength) => { BytesUploaded = bytesProcessed; TotalFileLength = totalLength; MyLogger.Assert(this.GetType() == typeof(Uploaders.FileUploader)); OnProgressChanged(BytesUploaded, TotalFileLength); }); var messageAppendedEventHandler = new MessageAppendedEventHandler((msg) => { OnMessageAppended($"[Rest]{msg}"); }); var chunkSentEventHandler = new RestRequests.ChunkSentEventHandler((coda) => { OnChunkSent(coda); }); int timeToWait = 500; uploadAgain_index :; uploader.ProgressChanged += progressChangedEventHandler; uploader.MessageAppended += messageAppendedEventHandler; uploader.ChunkSent += chunkSentEventHandler; await uploader.UploadAsync(); uploader.ProgressChanged -= progressChangedEventHandler; uploader.MessageAppended -= messageAppendedEventHandler; uploader.ChunkSent -= chunkSentEventHandler; switch (uploader.Status) { case RestRequests.Uploader.UploadStatus.Completed: { UploadedCloudFile = new CloudFile(uploader.CloudFileId, fileName, false, CloudFolder); Status = NetworkStatus.Completed; return; } case RestRequests.Uploader.UploadStatus.ErrorNeedRestart: { OnMessageAppended("Error need restart"); Status = NetworkStatus.ErrorNeedRestart; return; } case RestRequests.Uploader.UploadStatus.ErrorNeedResume: { if (timeToWait > Constants.MaxTimeToWait) { Status = NetworkStatus.ErrorNeedRestart; return; } OnMessageAppended($"Error need resume... Waiting for {timeToWait} minisecs..."); await Task.Delay(timeToWait); timeToWait *= 2; goto uploadAgain_index; } case RestRequests.Uploader.UploadStatus.Paused: { Status = NetworkStatus.Paused; return; } case RestRequests.Uploader.UploadStatus.Uploading: case RestRequests.Uploader.UploadStatus.NotStarted: default: throw new Exception($"uploader.Status: {uploader.Status}"); } } case NetworkStatus.Completed: case NetworkStatus.Networking: //case NetworkStatus.Starting: { OnMessageAppended($"Status: {Status}, no way to start"); return; } default: throw new Exception($"Status: {Status}"); } } catch (Exception error) { OnMessageAppended($"[Unexpected]{error}"); Status = NetworkStatus.ErrorNeedRestart; } finally { OnTotalFilesRemainChanged(-1); } }
protected override async Task StartPrivateAsync() { switch (Status) { case NetworkStatus.ErrorNeedRestart: case NetworkStatus.NotStarted: case NetworkStatus.Paused: { if (Status != NetworkStatus.Paused) { //Status = NetworkStatus.Starting; //MyLogger.Assert(downloader == null && windowsFile == null && fileStream == null); windowsFile = await CreateTemporaryFile(); fileStream = await windowsFile.OpenStreamForWriteAsync(); downloader = new RestRequests.Downloader(CloudFile.Id, fileStream); } Status = NetworkStatus.Networking; var progressChangedEventHandler = new RestRequests.ProgressChangedEventHandler((bytesProcessed, totalLength) => { BytesDownloaded = bytesProcessed; TotalFileLength = totalLength; MyLogger.Assert(this.GetType() == typeof(Downloaders.FileDownloader)); OnProgressChanged(BytesDownloaded, TotalFileLength); }); var messageAppendedEventHandler = new MessageAppendedEventHandler((msg) => { OnMessageAppended("Rest: " + msg); }); downloader.ProgressChanged += progressChangedEventHandler; downloader.MessageAppended += messageAppendedEventHandler; await downloader.DownloadAsync(); downloader.ProgressChanged -= progressChangedEventHandler; downloader.MessageAppended -= messageAppendedEventHandler; downloadAgain_index :; switch (downloader.Status) { case RestRequests.Downloader.DownloadStatus.Completed : { fileStream.Dispose(); Status = NetworkStatus.Completed; return; } case RestRequests.Downloader.DownloadStatus.ErrorNeedRestart: { OnMessageAppended("Error need restart"); Status = NetworkStatus.ErrorNeedRestart; return; } case RestRequests.Downloader.DownloadStatus.ErrorNeedResume: { OnMessageAppended("Error need resume..."); goto downloadAgain_index; } case RestRequests.Downloader.DownloadStatus.Paused: { Status = NetworkStatus.Paused; return; } case RestRequests.Downloader.DownloadStatus.Downloading: case RestRequests.Downloader.DownloadStatus.NotStarted: default: throw new Exception($"downloader.Status: {downloader.Status}"); } } case NetworkStatus.Completed: case NetworkStatus.Networking: //case NetworkStatus.Starting: default: throw new Exception($"Status: {Status}"); } }