Просмотр исходного кода

修复StaticClassCircularDependencyAnalyzer 线程安全问题导致的CPU高占用 (#453)

* 修复StaticClassCircularDependencyAnalyzer 线程安全问题导致的CPU高占用
susices 2 лет назад
Родитель
Сommit
6ec07f84e4
1 измененных файлов с 14 добавлено и 4 удалено
  1. 14 4
      Share/Analyzer/Analyzer/StaticClassCircularDependencyAnalyzer.cs

+ 14 - 4
Share/Analyzer/Analyzer/StaticClassCircularDependencyAnalyzer.cs

@@ -26,6 +26,8 @@ namespace ET.Analyzer
             DiagnosticSeverity.Error, true, Description);
 
         public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
+        
+        private object lockObj = new object();
 
         public override void Initialize(AnalysisContext context)
         {
@@ -97,9 +99,12 @@ namespace ET.Analyzer
 
             string methodClassTypeName = methodSymbol.ContainingType.ToString();
 
-            if (!staticClassSet.Contains(selfClassTypeName))
+            lock (this.lockObj)
             {
-                staticClassSet.Add(selfClassTypeName);
+                if (!staticClassSet.Contains(selfClassTypeName))
+                {
+                    staticClassSet.Add(selfClassTypeName);
+                }
             }
 
             // 筛选出对其他静态类的函数调用
@@ -118,10 +123,15 @@ namespace ET.Analyzer
                 dependencyMap[methodClassTypeName] = new HashSet<string>();
             }
 
-            if (!dependencyMap[methodClassTypeName].Contains(selfClassTypeName))
+            var set = dependencyMap[methodClassTypeName];
+            lock (set)
             {
-                dependencyMap[methodClassTypeName].Add(selfClassTypeName);
+                if (!set.Contains(selfClassTypeName))
+                {
+                    set.Add(selfClassTypeName);
+                }
             }
+            
         }
 
         /// <summary>