From: Kimura Youichi Date: Sat, 30 Nov 2019 15:17:36 +0000 (+0900) Subject: TimelineScheduler.Update* のdelegateを Task.Run の内側で実行する X-Git-Tag: OpenTween_v2.4.3~2 X-Git-Url: http://git.osdn.net/view?p=opentween%2Fopen-tween.git;a=commitdiff_plain;h=7f0bea3a3a6140583016fbd04f9eca41be1a9ba8 TimelineScheduler.Update* のdelegateを Task.Run の内側で実行する delegate 内で例外が発生した場合に RunUpdateTasks の途中で中断されてしまうのを防ぐため --- diff --git a/OpenTween/TimelineScheduler.cs b/OpenTween/TimelineScheduler.cs index 2006800e..07648d81 100644 --- a/OpenTween/TimelineScheduler.cs +++ b/OpenTween/TimelineScheduler.cs @@ -23,6 +23,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -239,61 +240,59 @@ namespace OpenTween private async Task RunUpdateTasks(UpdateTask tasks, DateTimeUtc now) { - var updateTasks = new List(capacity: 7); - - // LastUpdate* を次の時刻に更新してから Update* を実行すること - // (LastUpdate* が更新されずに Update* が例外を投げると無限ループに陥る) + var updateTasks = new List>(capacity: 7); if ((tasks & UpdateTask.Home) == UpdateTask.Home) { this.LastUpdateHome = now; if (this.UpdateHome != null) - updateTasks.Add(this.UpdateHome()); + updateTasks.Add(this.UpdateHome); } if ((tasks & UpdateTask.Mention) == UpdateTask.Mention) { this.LastUpdateMention = now; if (this.UpdateMention != null) - updateTasks.Add(this.UpdateMention()); + updateTasks.Add(this.UpdateMention); } if ((tasks & UpdateTask.Dm) == UpdateTask.Dm) { this.LastUpdateDm = now; if (this.UpdateDm != null) - updateTasks.Add(this.UpdateDm()); + updateTasks.Add(this.UpdateDm); } if ((tasks & UpdateTask.PublicSearch) == UpdateTask.PublicSearch) { this.LastUpdatePublicSearch = now; if (this.UpdatePublicSearch != null) - updateTasks.Add(this.UpdatePublicSearch()); + updateTasks.Add(this.UpdatePublicSearch); } if ((tasks & UpdateTask.User) == UpdateTask.User) { this.LastUpdateUser = now; if (this.UpdateUser != null) - updateTasks.Add(this.UpdateUser()); + updateTasks.Add(this.UpdateUser); } if ((tasks & UpdateTask.List) == UpdateTask.List) { this.LastUpdateList = now; if (this.UpdateList != null) - updateTasks.Add(this.UpdateList()); + updateTasks.Add(this.UpdateList); } if ((tasks & UpdateTask.Config) == UpdateTask.Config) { this.LastUpdateConfig = now; if (this.UpdateConfig != null) - updateTasks.Add(this.UpdateConfig()); + updateTasks.Add(this.UpdateConfig); } - await Task.WhenAll(updateTasks).ConfigureAwait(false); + await Task.WhenAll(updateTasks.Select(x => Task.Run(x))) + .ConfigureAwait(false); } private TimeSpan NextTimerDelay()