From c792389b41226c13009d6f8fa980ca521996f401 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 17 May 2021 15:48:51 +0800 Subject: [PATCH] Use locks to prevent concurrency confusion. I will re-think this design. --- .../Toolbars/ToolbarManager.cs | 21 ++++++++++++------- .../Volo/Abp/Ui/Navigation/MenuManager.cs | 21 ++++++++++++------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs index ecd73ac5ab..d8a0e68842 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; @@ -8,6 +9,7 @@ using Volo.Abp.AspNetCore.Mvc.UI.Theming; using Volo.Abp.Authorization.Permissions; using Volo.Abp.DependencyInjection; using Volo.Abp.SimpleStateChecking; +using Volo.Abp.Threading; namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars { @@ -17,6 +19,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars protected AbpToolbarOptions Options { get; } protected IServiceProvider ServiceProvider { get; } protected ISimpleStateCheckerManager SimpleStateCheckerManager { get; } + protected SemaphoreSlim SyncSemaphore { get; } public ToolbarManager( IOptions options, @@ -28,6 +31,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars SimpleStateCheckerManager = simpleStateCheckerManager; ServiceProvider = serviceProvider; Options = options.Value; + SyncSemaphore = new SemaphoreSlim(1, 1); } public async Task GetAsync(string name) @@ -36,16 +40,19 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars using (var scope = ServiceProvider.CreateScope()) { - RequirePermissionsSimpleBatchStateChecker.Instance.ClearCheckModels(); + using (await SyncSemaphore.LockAsync()) + { + RequirePermissionsSimpleBatchStateChecker.Instance.ClearCheckModels(); - var context = new ToolbarConfigurationContext(ThemeManager.CurrentTheme, toolbar, scope.ServiceProvider); + var context = new ToolbarConfigurationContext(ThemeManager.CurrentTheme, toolbar, scope.ServiceProvider); - foreach (var contributor in Options.Contributors) - { - await contributor.ConfigureToolbarAsync(context); - } + foreach (var contributor in Options.Contributors) + { + await contributor.ConfigureToolbarAsync(context); + } - await CheckPermissionsAsync(scope.ServiceProvider, toolbar); + await CheckPermissionsAsync(scope.ServiceProvider, toolbar); + } } return toolbar; diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs index d58c88b6e6..026a41999c 100644 --- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs +++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Options; using Volo.Abp.Authorization.Permissions; using Volo.Abp.DependencyInjection; using Volo.Abp.SimpleStateChecking; +using Volo.Abp.Threading; namespace Volo.Abp.UI.Navigation { @@ -14,6 +16,7 @@ namespace Volo.Abp.UI.Navigation protected AbpNavigationOptions Options { get; } protected IHybridServiceScopeFactory ServiceScopeFactory { get; } protected ISimpleStateCheckerManager SimpleStateCheckerManager { get; } + protected SemaphoreSlim SyncSemaphore { get; } public MenuManager( IOptions options, @@ -23,6 +26,7 @@ namespace Volo.Abp.UI.Navigation Options = options.Value; ServiceScopeFactory = serviceScopeFactory; SimpleStateCheckerManager = simpleStateCheckerManager; + SyncSemaphore = new SemaphoreSlim(1, 1); } public async Task GetAsync(string name) @@ -31,16 +35,19 @@ namespace Volo.Abp.UI.Navigation using (var scope = ServiceScopeFactory.CreateScope()) { - RequirePermissionsSimpleBatchStateChecker.Instance.ClearCheckModels(); + using (await SyncSemaphore.LockAsync()) + { + RequirePermissionsSimpleBatchStateChecker.Instance.ClearCheckModels(); - var context = new MenuConfigurationContext(menu, scope.ServiceProvider); + var context = new MenuConfigurationContext(menu, scope.ServiceProvider); - foreach (var contributor in Options.MenuContributors) - { - await contributor.ConfigureMenuAsync(context); - } + foreach (var contributor in Options.MenuContributors) + { + await contributor.ConfigureMenuAsync(context); + } - await CheckPermissionsAsync(scope.ServiceProvider, menu); + await CheckPermissionsAsync(scope.ServiceProvider, menu); + } } NormalizeMenu(menu);