public void StopToAccumulateScore() { if (!_isAccumulating) { return; } try { UpdateState(ScoreAccumulatingState.Stopping); _tokenSource.Cancel(false); _accumulateTask.Wait(); } catch (Exception ex) { ApplicationError.HandleUnexpectedError(ex); } finally { UpdateState(ScoreAccumulatingState.Stopped); _tokenSource.Dispose(); _tokenSource = null; _isAccumulating = false; } }
public async Task InitializeAsync() { await Task.Run(() => { try { var settingRepository = new SettingRepository(); ColumnVisibleSetting.Value = settingRepository.GetColumnVisibleSetting(); AppSetting.Value = settingRepository.GetAppSetting(); var isAutoImageSave = AppSetting.Value.IsAutoImageSave.Value; var isLatestScoreOutputAsText = AppSetting.Value.IsLatestScoreOutputAsText.Value; _scoreRepository = new ScoreRepository(); _scoreScreenShotRepository = ScoreScreenShotRepository.Create(isAutoImageSave); _scoreFileRepository = ScoreFileRepository.Create(isLatestScoreOutputAsText); _fezScreenShooter = new FEZScreenShooter(); _fezScoreAnalyzer = new FEZScoreAnalyzer(); // DBファイルが無ければ作成、作成済みだが古いバージョンの場合は自動で最新のテーブル構成に更新する _scoreRepository.Database.Migrate(); foreach (var score in _scoreRepository.ScoreDbSet.OrderBy(x => x.記録日時)) { RegisterToDbUpdateWhenPropertyChanged(score); ScoreCollection.Add(score); } LatestScore.Value = ScoreCollection.LastOrDefault() ?? new ScoreEntity(); // 監視状態ONの状態で終了していた場合は、初期化時に監視を開始する if (AppSetting.Value.IsAccumulatingAtLastTime.Value) { StartToAccumulateScore(); } } catch (Exception ex) { ApplicationError.HandleUnexpectedError(ex); } }); // 初回起動時は案内メッセージを表示する(2回目以降は表示しない) if (AppSetting.Value.IsFirstBoot.Value) { MessageBox.Show(Properties.Resources.FirstBootInfoMessage, "Info"); AppSetting.Value.IsFirstBoot.Value = false; } }
private async Task <AccumulateResult> AccumulateScoreAsync( FEZScreenShooter shooter, FEZScoreAnalyzer analyzer, ScoreFileRepository scoreFileRepository, ScoreScreenShotRepository screenShotRepository, ScoreRepository scoreRepository, AppSetting appSetting, CancellationToken token) { try { // スクリーンショットを取得 using (var bitmap = shooter.Shoot()) { if (bitmap == null) { return(AccumulateResult.FEZNotRunning); } // スクリーンショットからスコアを取得 var score = analyzer.Analyze(bitmap); // 取得できなければ終了 if (score == null) { return(AccumulateResult.NotScoreCapture); } // スコア画面を開きながらアプリを再起動した場合などを想定して、 // 最新スコアの詳細スコアが全て同じものは既に登録済みとして終了する var latestScore = LatestScore.Value; if (score.PC与ダメージ == latestScore.PC与ダメージ && score.キルダメージボーナス == latestScore.キルダメージボーナス && score.召喚解除ボーナス == latestScore.召喚解除ボーナス && score.建築与ダメージ == latestScore.建築与ダメージ && score.領域破壊ボーナス == latestScore.領域破壊ボーナス && score.領域ダメージボーナス == latestScore.領域ダメージボーナス && score.貢献度 == latestScore.貢献度 && score.クリスタル運用ボーナス == latestScore.クリスタル運用ボーナス && score.召喚行動ボーナス == latestScore.召喚行動ボーナス) { return(AccumulateResult.NotScoreCapture); } RegisterToDbUpdateWhenPropertyChanged(score); // 画像保存 if (appSetting.IsAutoImageSave.Value) { await screenShotRepository.SaveAsPngAsync(score, bitmap); } // テキスト保存 if (appSetting.IsLatestScoreOutputAsText.Value) { await scoreFileRepository.SaveAsLatestScoreAsync(appSetting.LatestScoreTextFormat.Value, score); } // DB保存 await scoreRepository.ScoreDbSet.AddAsync(score); await scoreRepository.SaveChangesAsync(); // プロパティも更新 ScoreCollection.Add(score); LatestScore.Value = score; } } catch (OperationCanceledException) { } catch (Exception ex) { ApplicationError.HandleUnexpectedError(ex); } return(AccumulateResult.Successed); }