From 34e6fd36e4377f9425d963bff1130c69dee0d269 Mon Sep 17 00:00:00 2001 From: Yan Maniez Date: Mon, 17 Dec 2018 08:53:57 +0100 Subject: [PATCH] Ajout d'un semaphore autour de la bdd library --- .../ViewModels/DeepSearchViewModel.cs | 5 +++ .../AideDeJeu/ViewModels/FilterViewModel.cs | 34 +++++++++++++++++-- .../AideDeJeu/ViewModels/StoreViewModel.cs | 8 +++++ .../AideDeJeu/Views/ItemDetailPage.xaml.cs | 5 +++ 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/AideDeJeu/AideDeJeu/ViewModels/DeepSearchViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/DeepSearchViewModel.cs index dda95666..b0ff8aeb 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/DeepSearchViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/DeepSearchViewModel.cs @@ -61,6 +61,7 @@ namespace AideDeJeu.ViewModels { try { + await StoreViewModel.SemaphoreLibrary.WaitAsync(); using (var context = await StoreViewModel.GetLibraryContextAsync()) { var primary = await context.Items. @@ -123,6 +124,10 @@ namespace AideDeJeu.ViewModels { return new List(); } + finally + { + StoreViewModel.SemaphoreLibrary.Release(); + } } diff --git a/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs index eb19bd61..5bb7bf2c 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs @@ -319,6 +319,7 @@ namespace AideDeJeu.ViewModels var source = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Source).SelectedKey ?? ""; try { + await StoreViewModel.SemaphoreLibrary.WaitAsync(); using (var context = await StoreViewModel.GetLibraryContextAsync()) { return context.SpellsVO.Where(spell => @@ -338,6 +339,10 @@ namespace AideDeJeu.ViewModels { return new List(); } + finally + { + StoreViewModel.SemaphoreLibrary.Release(); + } } public override List> Classes { get; } = new List>() @@ -406,6 +411,7 @@ namespace AideDeJeu.ViewModels var source = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Source).SelectedKey ?? ""; try { + await StoreViewModel.SemaphoreLibrary.WaitAsync(); using (var context = await StoreViewModel.GetLibraryContextAsync()) { return context.SpellsHD.Where(spell => @@ -425,6 +431,10 @@ namespace AideDeJeu.ViewModels { return new List(); } + finally + { + StoreViewModel.SemaphoreLibrary.Release(); + } } public override List> Classes { get; } = new List>() @@ -674,6 +684,7 @@ namespace AideDeJeu.ViewModels try { + await StoreViewModel.SemaphoreLibrary.WaitAsync(); using (var context = await StoreViewModel.GetLibraryContextAsync()) { return context.MonstersVO.Where(monster => @@ -694,6 +705,10 @@ namespace AideDeJeu.ViewModels { return new List(); } + finally + { + StoreViewModel.SemaphoreLibrary.Release(); + } } public override List> Categories { get; } = new List>() @@ -796,6 +811,7 @@ namespace AideDeJeu.ViewModels try { + await StoreViewModel.SemaphoreLibrary.WaitAsync(); using (var context = await StoreViewModel.GetLibraryContextAsync()) { return context.MonstersHD.Where(monster => @@ -816,6 +832,10 @@ namespace AideDeJeu.ViewModels { return new List(); } + finally + { + StoreViewModel.SemaphoreLibrary.Release(); + } } public override List> Categories { get; } = new List>() { @@ -935,7 +955,8 @@ namespace AideDeJeu.ViewModels try { - using (var context = await GetLibraryContextAsync()) + await StoreViewModel.SemaphoreLibrary.WaitAsync(); + using (var context = await StoreViewModel.GetLibraryContextAsync()) { return context.Equipments.Where(equipment => equipment.Type.ToLower().Contains(type.ToLower()) && @@ -953,6 +974,10 @@ namespace AideDeJeu.ViewModels { return new List(); } + finally + { + StoreViewModel.SemaphoreLibrary.Release(); + } } public abstract List> Types { get; } @@ -1042,7 +1067,8 @@ namespace AideDeJeu.ViewModels try { - using (var context = await GetLibraryContextAsync()) + await StoreViewModel.SemaphoreLibrary.WaitAsync(); + using (var context = await StoreViewModel.GetLibraryContextAsync()) { return context.MagicItems.Where(magicitem => MatchContains(magicitem.Type, type) && @@ -1056,6 +1082,10 @@ namespace AideDeJeu.ViewModels { return new List(); } + finally + { + StoreViewModel.SemaphoreLibrary.Release(); + } } public abstract List> Types { get; } diff --git a/AideDeJeu/AideDeJeu/ViewModels/StoreViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/StoreViewModel.cs index 42743360..0574f986 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/StoreViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/StoreViewModel.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; +using System.Threading; using System.Threading.Tasks; using Xamarin.Forms; @@ -405,6 +406,8 @@ namespace AideDeJeu.ViewModels } } + public static SemaphoreSlim SemaphoreLibrary = new SemaphoreSlim(1, 1); + public static async Task GetLibraryContextAsync() { var dbPath = await DependencyService.Get().GetDatabasePathAsync("library"); @@ -420,6 +423,7 @@ namespace AideDeJeu.ViewModels } try { + await SemaphoreLibrary.WaitAsync(); using (var context = await GetLibraryContextAsync()) { return await context.Items.Where(item => item.Id == id || item.RootId == id).FirstOrDefaultAsync(); @@ -429,6 +433,10 @@ namespace AideDeJeu.ViewModels { return null; } + finally + { + SemaphoreLibrary.Release(); + } } public async Task GetItemFromDataAsyncOld(string source, string anchor) diff --git a/AideDeJeu/AideDeJeu/Views/ItemDetailPage.xaml.cs b/AideDeJeu/AideDeJeu/Views/ItemDetailPage.xaml.cs index 50585d25..e7bbc7a0 100644 --- a/AideDeJeu/AideDeJeu/Views/ItemDetailPage.xaml.cs +++ b/AideDeJeu/AideDeJeu/Views/ItemDetailPage.xaml.cs @@ -64,6 +64,7 @@ namespace AideDeJeu.Views await Task.Delay(1000).ConfigureAwait(false); try { + await StoreViewModel.SemaphoreLibrary.WaitAsync(); using (var context = await StoreViewModel.GetLibraryContextAsync().ConfigureAwait(false)) { var item = context.Items.FirstOrDefault(); @@ -72,6 +73,10 @@ namespace AideDeJeu.Views catch { } + finally + { + StoreViewModel.SemaphoreLibrary.Release(); + } }