Пример #1
0
        // ====================================================================
        // 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"));
            }
        }