From 7cb5a25483d1f185076458e830021d4f17068c15 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Mon, 13 Nov 2023 22:45:58 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=A0=E3=83=A9?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E6=9B=B4=E6=96=B0=E3=81=AB30=E7=A7=92?= =?UTF-8?q?=E4=BB=A5=E4=B8=8A=E6=8E=9B=E3=81=8B=E3=81=A3=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=82=8B=E5=A0=B4=E5=90=88=E3=81=AF=E5=AE=8C=E4=BA=86=E3=82=92?= =?UTF-8?q?=E5=BE=85=E6=A9=9F=E3=81=9B=E3=81=9A=E6=AC=A1=E3=81=AE=E3=82=BF?= =?UTF-8?q?=E3=82=A4=E3=83=9E=E3=83=BC=E3=82=92=E9=96=8B=E5=A7=8B=E3=81=95?= =?UTF-8?q?=E3=81=9B=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.txt | 2 ++ OpenTween/TimelineScheduler.cs | 25 ++++++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 3ef60c47f..1a29ace72 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,8 @@ 更新履歴 ==== Unreleased + * CHG: タイムライン更新が停止する不具合が報告される件への暫定的な対処 + - タイムライン更新に30秒以上掛かっている場合は完了を待機せず次のタイマーを開始させる * FIX: 動画のサムネイル表示時に再生可能であることを示すアイコンが表示されない不具合を修正 ==== Ver 3.7.1(2023/07/20) diff --git a/OpenTween/TimelineScheduler.cs b/OpenTween/TimelineScheduler.cs index b7d1cb52f..a2157f7dc 100644 --- a/OpenTween/TimelineScheduler.cs +++ b/OpenTween/TimelineScheduler.cs @@ -135,12 +135,22 @@ private async Task TimerCallback() { this.preventTimerUpdate = true; - var updateTasks = this.systemResumeMode + var (taskTypes, updateTasks) = this.systemResumeMode ? this.TimerCallback_AfterSystemResume() : this.TimerCallback_Normal(); - await updateTasks.RunAll(runOnThreadPool: true) - .ConfigureAwait(false); + var updateTask = updateTasks.RunAll(runOnThreadPool: true); + + // すべてのコールバック関数の Task が完了してから次のタイマーの待機時間を計算する + // ただし、30 秒を超過した場合はエラー報告のダイアログを表示した上で完了を待たずにタイマーを再開する + // (タイムライン更新が停止する不具合が報告される件への暫定的な対処) + var timeout = Task.Delay(TimeSpan.FromSeconds(30)); + if (await Task.WhenAny(updateTask, timeout) == timeout) + { + var message = "タイムライン更新が規定時間内に完了しませんでした: " + + string.Join(", ", taskTypes); + throw new Exception(message); + } } finally { @@ -149,7 +159,7 @@ await updateTasks.RunAll(runOnThreadPool: true) } } - private TaskCollection TimerCallback_Normal() + private (TimelineSchedulerTaskType[] TaskTypes, TaskCollection Task) TimerCallback_Normal() { var now = DateTimeUtc.Now; var round = TimeSpan.FromSeconds(1); // 1秒未満の差異であればまとめて実行する @@ -162,16 +172,17 @@ private TaskCollection TimerCallback_Normal() tasks.Add(taskType); } - return this.RunUpdateTasks(tasks, now); + return (tasks.ToArray(), this.RunUpdateTasks(tasks, now)); } - private TaskCollection TimerCallback_AfterSystemResume() + private (TimelineSchedulerTaskType[] TaskTypes, TaskCollection Task) TimerCallback_AfterSystemResume() { // systemResumeMode では一定期間経過後に全てのタイムラインを更新する var now = DateTimeUtc.Now; this.systemResumeMode = false; - return this.RunUpdateTasks(TimelineScheduler.AllTaskTypes, now); + var taskTypes = TimelineScheduler.AllTaskTypes; + return (taskTypes, this.RunUpdateTasks(taskTypes, now)); } private TaskCollection RunUpdateTasks(IEnumerable taskTypes, DateTimeUtc now) From e6099ad9c8446be808805cee19d08344118c09b0 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Mon, 13 Nov 2023 22:46:17 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=A0=E3=83=A9?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E6=9B=B4=E6=96=B0=E3=81=AE=E6=AC=A1=E5=9B=9E?= =?UTF-8?q?=E5=AE=9F=E8=A1=8C=E3=81=8C1=E6=99=82=E9=96=93=E4=BB=A5?= =?UTF-8?q?=E4=B8=8A=E5=85=88=E3=81=AB=E3=81=AA=E3=82=8B=E5=A0=B4=E5=90=88?= =?UTF-8?q?=E3=81=AF=E7=95=B0=E5=B8=B8=E5=80=A4=E3=81=A8=E3=81=97=E3=81=A6?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=9E=E3=83=BC=E3=82=92=E3=83=AA=E3=82=BB?= =?UTF-8?q?=E3=83=83=E3=83=88=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.txt | 1 + OpenTween/TimelineScheduler.cs | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 1a29ace72..a650266f3 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -3,6 +3,7 @@ ==== Unreleased * CHG: タイムライン更新が停止する不具合が報告される件への暫定的な対処 - タイムライン更新に30秒以上掛かっている場合は完了を待機せず次のタイマーを開始させる + - タイムライン更新の次回実行が1時間以上先になる場合は異常値としてタイマーをリセットする * FIX: 動画のサムネイル表示時に再生可能であることを示すアイコンが表示されない不具合を修正 ==== Ver 3.7.1(2023/07/20) diff --git a/OpenTween/TimelineScheduler.cs b/OpenTween/TimelineScheduler.cs index a2157f7dc..1562711ca 100644 --- a/OpenTween/TimelineScheduler.cs +++ b/OpenTween/TimelineScheduler.cs @@ -105,9 +105,26 @@ public void RefreshSchedule() return; // TimerCallback 内で更新されるのでここは単に無視してよい if (this.Enabled) - this.timer.Change(this.NextTimerDelay(), Timeout.InfiniteTimeSpan); + { + var delay = this.NextTimerDelay(); + + // タイマーの待機時間が 1 時間を超える値になった場合は異常値として強制的にリセットする + // (タイムライン更新が停止する不具合が報告される件への暫定的な対処) + if (delay >= TimeSpan.FromHours(1)) + { + MyCommon.ExceptionOut(new Exception("タイムライン更新の待機時間が異常値のためリセットします: " + delay)); + foreach (var key in this.LastUpdatedAt.Keys) + this.LastUpdatedAt[key] = DateTimeUtc.MinValue; + + delay = TimeSpan.FromSeconds(10); + } + + this.timer.Change(delay, Timeout.InfiniteTimeSpan); + } else + { this.timer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan); + } } public void SystemResumed()