public override async Task ResetAsync()
                {
                    windowsFile = await CreateTemporaryFile();

                    fileStream = await windowsFile.OpenStreamForWriteAsync();

                    downloader = new RestRequests.Downloader(CloudFile.Id, fileStream);
                }
                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}");
                    }
                }