Procházet zdrojové kódy

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

* 修复StaticClassCircularDependencyAnalyzer 线程安全问题导致的CPU高占用
susices před 2 roky
rodič
revize
6ec07f84e4

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

@@ -26,6 +26,8 @@ namespace ET.Analyzer
             DiagnosticSeverity.Error, true, Description);
             DiagnosticSeverity.Error, true, Description);
 
 
         public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
         public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
+        
+        private object lockObj = new object();
 
 
         public override void Initialize(AnalysisContext context)
         public override void Initialize(AnalysisContext context)
         {
         {
@@ -97,9 +99,12 @@ namespace ET.Analyzer
 
 
             string methodClassTypeName = methodSymbol.ContainingType.ToString();
             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>();
                 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>
         /// <summary>