async public Task<FFile> Upload(int fFileID) { while (IsNetworkOk == false) { await Task.Delay(TimeSpan.FromSeconds(3)); } var file = fFileLogic.GetForSure(fFileID); if (file == null) { fFileLogic.DoUpdate(fFileID, f => { f.Status = FFileStatus.NonExisting; }); } else { var isExisted = fFileLogic.CheckExistHashCode(ExistFile, fFileID); if (isExisted) { file = fFileLogic.DoUpdate(fFileID, file1 => { if (file1.Status == FFileStatus.New) { file1.Status = FFileStatus.Existing; file1.ProcessingStatus = null; } }); } else { var progress = new Progress<UploadProgressChangedEventArgs>(); progress.ToObservable() .DistinctUntilChanged(r => (int)r.EventArgs.UploadPercentage() / 5) .Subscribe(r => { FlickrLogic.UploadEventList.Add(new Notice() { Type = NoticeType.Upload, JobDone = r.EventArgs.BytesSent, JobTotal = r.EventArgs.TotalBytesToSend, Percentage = r.EventArgs.UploadPercentage(), FullPath = file.Path, Note = "Uploading", }); }) ; var photoID = await flickr.UploadPicture(file.Path, tags: file.GetHashCodeTag(), progress: progress); if (string.IsNullOrEmpty(photoID)) { } else { file = fFileLogic.DoUpdate(fFileID, file1 => { file1.PhotoID = photoID; file1.Status = FFileStatus.Uploaded_NoSet; file1.UserID = Flickr.User.UserId; }); UpdateSets(file.Id); FlickrLogic.Log(file.Path, NoticeType.UploadDone, "Uploaded"); } } } return file; }