// ==================================================================== // protected 関数 // ==================================================================== // -------------------------------------------------------------------- // ネビュラコア(検索データ作成)のメインルーチン // -------------------------------------------------------------------- protected override Task CoreMainAsync() { while (true) { MainEvent.WaitOne(); Int32 startTick = Environment.TickCount; try { YlModel.Instance.EnvModel.AppCancellationTokenSource.Token.ThrowIfCancellationRequested(); if (YlModel.Instance.ProjModel.UndoneTargetFolderInfo() == null) { continue; } YlModel.Instance.EnvModel.YukaListerPartsStatus[(Int32)YukaListerPartsStatusIndex.Sifolin] = YukaListerStatus.Running; YlModel.Instance.EnvModel.LogWriter.LogMessage(Common.TRACE_EVENT_TYPE_STATUS, GetType().Name + " アクティブ化。"); if (YlModel.Instance.EnvModel.YlSettings.ApplyMusicInfoIntelligently) { YlModel.Instance.EnvModel.LogWriter.LogMessage(Common.TRACE_EVENT_TYPE_STATUS, "楽曲情報データベースが不十分な場合の誤適用を軽減する設定。"); } MusicInfoDatabaseToMemory(); _prevFolderTaskDetail = FolderTaskDetail.Done; while (true) { TargetFolderInfo?targetFolderInfo; // 削除 targetFolderInfo = YlModel.Instance.ProjModel.FindTargetFolderInfo(FolderTaskDetail.Remove); if (targetFolderInfo != null) { Remove(targetFolderInfo); continue; } // キャッシュ活用(全体の動作状況がエラーではない場合のみ) if (YlModel.Instance.EnvModel.YukaListerWholeStatus != YukaListerStatus.Error) { targetFolderInfo = YlModel.Instance.ProjModel.FindTargetFolderInfo(FolderTaskDetail.CacheToDisk); if (targetFolderInfo != null) { CacheToDisk(targetFolderInfo); continue; } } // すべてのフォルダーのキャッシュ活用が終わったら Yurelin をアクティブ化する // 起動直後に前回のゆかり予約を解析することを想定している if (_prevFolderTaskDetail == FolderTaskDetail.CacheToDisk) { Debug.WriteLine("Sifolin.CoreMain() キャッシュ活用後の Yurelin アクティブ化"); YlCommon.ActivateYurelinIfNeeded(); } // 更新削除 targetFolderInfo = YlModel.Instance.ProjModel.FindTargetFolderInfo(FolderTaskDetail.UpdateRemove); if (targetFolderInfo != null) { UpdateRemove(targetFolderInfo); continue; } // 更新サブフォルダー検索 targetFolderInfo = YlModel.Instance.ProjModel.FindTargetFolderInfo(FolderTaskDetail.UpdateFindSubFolders); if (targetFolderInfo != null) { UpdateFindSubFolders(targetFolderInfo); continue; } // サブフォルダー検索 targetFolderInfo = YlModel.Instance.ProjModel.FindTargetFolderInfo(FolderTaskDetail.FindSubFolders); if (targetFolderInfo != null) { FindSubFolders(targetFolderInfo); continue; } // ファイル名追加 targetFolderInfo = YlModel.Instance.ProjModel.FindTargetFolderInfo(FolderTaskDetail.AddFileNames); if (targetFolderInfo != null) { AddFileNames(targetFolderInfo); continue; } // ファイル情報追加 targetFolderInfo = YlModel.Instance.ProjModel.FindTargetFolderInfo(FolderTaskDetail.AddInfos); if (targetFolderInfo != null) { AddInfos(targetFolderInfo); continue; } // メモリー DB → ディスク DB(全体の動作状況がエラーではない場合のみ) if (_needsMemoryDbToDiskDb && YlModel.Instance.EnvModel.YukaListerWholeStatus != YukaListerStatus.Error) { MemoryToDisk(); _needsMemoryDbToDiskDb = false; continue; } // メモリー DB → キャッシュ DB if (_needsMemoryDbToCacheDb) { MemoryToCache(); _needsMemoryDbToCacheDb = false; continue; } // Kamlin アクティブ化 YlCommon.ActivateKamlinIfNeeded(); // Yurelin アクティブ化 YlCommon.ActivateYurelinIfNeeded(); // やることが無くなったのでループを抜けて待機へ向かう break; } } catch (OperationCanceledException) { return(Task.CompletedTask); } catch (Exception ex) { YlModel.Instance.EnvModel.NebulaCoreErrors.Enqueue(GetType().Name + " ループ稼働時エラー:\n" + ex.Message); YlModel.Instance.EnvModel.LogWriter.LogMessage(Common.TRACE_EVENT_TYPE_STATUS, " スタックトレース:\n" + ex.StackTrace); } // 念のため最後に表示を更新 YlModel.Instance.EnvModel.YukaListerPartsStatus[(Int32)YukaListerPartsStatusIndex.Sifolin] = YukaListerStatus.Ready; YlModel.Instance.EnvModel.IsMainWindowDataGridCountChanged = true; 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")); } }