From a251db804c20201c587f788bb6ded8d4ee9e1cec Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 22 Nov 2016 16:13:38 +0900 Subject: [PATCH] Stop adding beatmaps to song select when disposed. --- osu.Game/Screens/Select/PlaySongSelect.cs | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs index d5b66d5bd7..2a0aff0de6 100644 --- a/osu.Game/Screens/Select/PlaySongSelect.cs +++ b/osu.Game/Screens/Select/PlaySongSelect.cs @@ -3,6 +3,7 @@ using System; using System.Linq; +using System.Threading; using System.Threading.Tasks; using osu.Framework.Allocation; using osu.Framework.Audio; @@ -44,6 +45,7 @@ namespace osu.Game.Screens.Select private Container wedgedBeatmapInfo; private static readonly Vector2 BACKGROUND_BLUR = new Vector2(20); + private CancellationTokenSource initialAddSetsTask; /// Optionally provide a database to use instead of the OsuGame one. public PlaySongSelect(BeatmapDatabase database = null) @@ -156,11 +158,18 @@ namespace osu.Game.Screens.Select if (database == null) database = beatmaps; - database.BeatmapSetAdded += s => Schedule(() => addBeatmapSet(s, game)); + database.BeatmapSetAdded += onDatabaseOnBeatmapSetAdded; trackManager = audio.Track; - Task.Factory.StartNew(() => addBeatmapSets(game)); + initialAddSetsTask = new CancellationTokenSource(); + + Task.Factory.StartNew(() => addBeatmapSets(game, initialAddSetsTask.Token), initialAddSetsTask.Token); + } + + private void onDatabaseOnBeatmapSetAdded(BeatmapSetInfo s) + { + Schedule(() => addBeatmapSet(s, Game)); } protected override void OnEntering(GameMode last) @@ -199,6 +208,10 @@ namespace osu.Game.Screens.Select base.Dispose(isDisposing); if (playMode != null) playMode.ValueChanged -= playMode_ValueChanged; + + database.BeatmapSetAdded -= onDatabaseOnBeatmapSetAdded; + + initialAddSetsTask.Cancel(); } private void playMode_ValueChanged(object sender, EventArgs e) @@ -396,10 +409,13 @@ namespace osu.Game.Screens.Select })); } - private void addBeatmapSets(BaseGame game) + private void addBeatmapSets(BaseGame game, CancellationToken token) { foreach (var beatmapSet in database.Query()) + { + if (token.IsCancellationRequested) return; addBeatmapSet(beatmapSet, game); + } } } }