From f2f768f7443b3c687f2164984bd930c48b661070 Mon Sep 17 00:00:00 2001 From: lindexi Date: Fri, 2 Oct 2020 08:47:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BA=BF=E7=A8=8B=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E7=9A=84=E5=A4=9A=E6=AC=A1=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 不应该通过 TryGet 然后进入 TryAdd 的方法,因为在多线程进入的时候,此时如果进入了 TryGet 有两个线程同时进入,同时拿不到,于是进入后续的代码,此时后续的代码将会被两次调用。在两次调用将会进入两次的 TryAdd 方法,只有一个线程能成功。因此原先的代码的影响只是会在多线程进入多次调用本地函数。更改之后的代码在多线程进入都只会调用本地函数一次 --- framework/Fur/DataValidation/Validators/DataValidator.cs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/framework/Fur/DataValidation/Validators/DataValidator.cs b/framework/Fur/DataValidation/Validators/DataValidator.cs index c4391cd7c0..88f624ea74 100644 --- a/framework/Fur/DataValidation/Validators/DataValidator.cs +++ b/framework/Fur/DataValidation/Validators/DataValidator.cs @@ -210,8 +210,7 @@ namespace Fur.DataValidation /// private static (string ValidationName, ValidationItemMetadataAttribute ValidationItemMetadata) GetValidationTypeValidationItemMetadata(object validationType) { - var isCached = GetValidationTypeValidationItemMetadataCached.TryGetValue(validationType, out var validation); - if (isCached) return validation; + return GetValidationTypeValidationItemMetadataCached.GetOrAdd(validationType, Function); // 本地函数 static (string, ValidationItemMetadataAttribute) Function(object validationType) @@ -235,11 +234,6 @@ namespace Fur.DataValidation return (validationName, validationItemMetadataAttribute); } - - // 调用本地函数 - validation = Function(validationType); - GetValidationTypeValidationItemMetadataCached.TryAdd(validationType, validation); - return validation; } /// -- Gitee