// ==================================================================== // コンストラクター // ==================================================================== // -------------------------------------------------------------------- // メインコンストラクター // -------------------------------------------------------------------- public SyncDataIo() { // 最初にログの設定 YlCommon.SetLogWriterSyncDetail(_logWriterSyncDetail); _musicInfoContext = new(); _yukariStatisticsContext = new(); }
// ==================================================================== // protected 関数 // ==================================================================== // -------------------------------------------------------------------- // ネビュラコア(同期)のメインルーチン // -------------------------------------------------------------------- protected override async Task CoreMainAsync() { #if DEBUGz Debug.WriteLine("priority before: " + Thread.CurrentThread.Priority.ToString()); Thread.CurrentThread.Priority = ThreadPriority.Lowest; Debug.WriteLine("priority after: " + Thread.CurrentThread.Priority.ToString()); #endif YlCommon.SetLogWriterSyncDetail(_logWriterSyncDetail); while (true) { MainEvent.WaitOne(); Debug.Assert(MainWindowViewModel != null, "Syclin.CoreMain() MainWindowViewModel is null"); Int32 startTick = Environment.TickCount; try { YlModel.Instance.EnvModel.AppCancellationTokenSource.Token.ThrowIfCancellationRequested(); if (YlModel.Instance.EnvModel.YukaListerWholeStatus == YukaListerStatus.Error) { continue; } if (!YlModel.Instance.EnvModel.YlSettings.SyncMusicInfoDb) { continue; } IsActive = true; YlModel.Instance.EnvModel.LogWriter.LogMessage(Common.TRACE_EVENT_TYPE_STATUS, GetType().Name + " アクティブ化。"); // ログイン MainWindowViewModel.SetStatusBarMessageWithInvoke(Common.TRACE_EVENT_TYPE_STATUS, "同期準備中..."); await LoginToSyncServerAsync(); // データベースをバックアップ using MusicInfoContextDefault musicInfoContextDefault = new(); musicInfoContextDefault.BackupDatabase(); using YukariStatisticsContext yukariStatisticsContext = new(); yukariStatisticsContext.BackupDatabase(); // 再取得の場合は楽曲情報データベース初期化 CreateDatabaseIfNeeded(musicInfoContextDefault, yukariStatisticsContext); // ダウンロード (Int32 numTotalDownloads, Int32 numTotalImports) = await DownloadSyncDataAsync(); // アップロード Int32 numTotalUploads = await UploadSyncDataAsync(); if (numTotalUploads > 0) { // アップロードを行った場合は、自身がアップロードしたデータの更新日・Dirty を更新するために再ダウンロードが必要 (numTotalDownloads, numTotalImports) = await DownloadSyncDataAsync(); } // 完了表示 MainWindowViewModel.SetStatusBarMessageWithInvoke(Common.TRACE_EVENT_TYPE_STATUS, "データベース同期完了(ダウンロード" + (numTotalDownloads == 0 ? "無" : " " + numTotalDownloads.ToString("#,0") + " 件、うち " + numTotalImports.ToString("#,0") + " 件インポート") + "、アップロード" + (numTotalUploads == 0 ? "無" : " " + numTotalUploads.ToString("#,0") + " 件") + ")"); // 起動直後は Syclin と Yurelin が両方起動され、Syclin による属性未確認データのアップロード&ダウンロードと、Yurelin による属性確認が競合し、属性未確認の状態に戻ることがある // Syclin スリープ化直前に Yurelin を起動し、再度属性確認が行われるようにする YlCommon.ActivateYurelinIfNeeded(); } catch (OperationCanceledException) { return; } catch (Exception excep) { DbCommon.LogDatabaseExceptionIfCan(excep); // メッセージボックスではなくステータスバーにエラー表示 MainWindowViewModel.SetStatusBarMessageWithInvoke(TraceEventType.Error, excep.Message); YlModel.Instance.EnvModel.LogWriter.LogMessage(Common.TRACE_EVENT_TYPE_STATUS, " スタックトレース:\n" + excep.StackTrace); } IsActive = false; TimeSpan timeSpan = new(YlCommon.MiliToHNano(Environment.TickCount - startTick)); YlModel.Instance.EnvModel.LogWriter.LogMessage(Common.TRACE_EVENT_TYPE_STATUS, GetType().Name + " スリープ化:アクティブ時間:" + timeSpan.ToString(@"hh\:mm\:ss")); } }