public override async Task ResetAsync()
                {
                    try
                    {
                        Status = NetworkStatus.NotStarted;
                        if (fileStream != null)
                        {
                            fileStream.Dispose();
                            fileStream = null;
                        }
                        fileStream = await windowsFile.OpenStreamForReadAsync();

                        uploader = new RestRequests.Uploader(new List <string> {
                            CloudFolder.Id
                        }, fileStream, fileName);
                    }
                    catch (Exception error)
                    {
                        OnMessageAppended($"Unexpected: {error}");
                        Status = NetworkStatus.ErrorNeedRestart;
                    }
                }
                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);
                    }
                }