diff --git a/GFramework.Core/Coroutine/CoroutineStatistics.cs b/GFramework.Core/Coroutine/CoroutineStatistics.cs index 69463d72..66126c02 100644 --- a/GFramework.Core/Coroutine/CoroutineStatistics.cs +++ b/GFramework.Core/Coroutine/CoroutineStatistics.cs @@ -12,7 +12,13 @@ internal sealed class CoroutineStatistics : ICoroutineStatistics { private readonly Dictionary _countByPriority = new(); private readonly Dictionary _countByTag = new(StringComparer.Ordinal); +#if NET9_0_OR_GREATER + // net9.0 及以上目标使用专用 Lock,以满足分析器对专用同步原语的建议。 + private readonly System.Threading.Lock _lock = new(); +#else + // net8.0 目标仍回退到 object 锁,以保持多目标编译兼容性。 private readonly object _lock = new(); +#endif private int _activeCount; private double _maxExecutionTimeMs; private int _pausedCount; diff --git a/GFramework.Core/Events/EventStatistics.cs b/GFramework.Core/Events/EventStatistics.cs index 22ae8b2f..d1b6e63f 100644 --- a/GFramework.Core/Events/EventStatistics.cs +++ b/GFramework.Core/Events/EventStatistics.cs @@ -10,7 +10,13 @@ namespace GFramework.Core.Events; public sealed class EventStatistics : IEventStatistics { private readonly Dictionary _listenerCountByType = new(StringComparer.Ordinal); +#if NET9_0_OR_GREATER + // net9.0 及以上目标使用专用 Lock,以满足分析器对专用同步原语的建议。 + private readonly System.Threading.Lock _lock = new(); +#else + // net8.0 目标仍回退到 object 锁,以保持多目标编译兼容性。 private readonly object _lock = new(); +#endif private readonly Dictionary _publishCountByType = new(StringComparer.Ordinal); private long _totalFailed; private long _totalHandled; diff --git a/GFramework.Core/Events/FilterableEvent.cs b/GFramework.Core/Events/FilterableEvent.cs index 9c6b8152..58bbd92c 100644 --- a/GFramework.Core/Events/FilterableEvent.cs +++ b/GFramework.Core/Events/FilterableEvent.cs @@ -10,7 +10,13 @@ namespace GFramework.Core.Events; public sealed class FilterableEvent { private readonly List> _filters = new(); +#if NET9_0_OR_GREATER + // net9.0 及以上目标使用专用 Lock,以满足分析器对专用同步原语的建议。 + private readonly System.Threading.Lock _lock = new(); +#else + // net8.0 目标仍回退到 object 锁,以保持多目标编译兼容性。 private readonly object _lock = new(); +#endif private readonly EventStatistics? _statistics; private Action? _onEvent; @@ -152,4 +158,4 @@ public sealed class FilterableEvent var count = _onEvent?.GetInvocationList().Length ?? 0; _statistics.UpdateListenerCount(typeof(T).Name, count); } -} \ No newline at end of file +} diff --git a/GFramework.Core/Events/PriorityEvent.cs b/GFramework.Core/Events/PriorityEvent.cs index 8555e933..3d4f4e2a 100644 --- a/GFramework.Core/Events/PriorityEvent.cs +++ b/GFramework.Core/Events/PriorityEvent.cs @@ -21,7 +21,13 @@ public class PriorityEvent : IEvent /// /// 保护处理器集合的并发访问 /// +#if NET9_0_OR_GREATER + // net9.0 及以上目标使用专用 Lock,以满足分析器对专用同步原语的建议。 + private readonly System.Threading.Lock _syncRoot = new(); +#else + // net8.0 目标仍回退到 object 锁,以保持多目标编译兼容性。 private readonly object _syncRoot = new(); +#endif /// /// 标记事件是否已被处理(用于 UntilHandled 传播模式) @@ -326,4 +332,4 @@ public class PriorityEvent : IEvent public Action> Handler { get; } = handler; public int Priority { get; } = priority; } -} \ No newline at end of file +} diff --git a/GFramework.Core/Events/WeakEvent.cs b/GFramework.Core/Events/WeakEvent.cs index 8d4f9901..72959133 100644 --- a/GFramework.Core/Events/WeakEvent.cs +++ b/GFramework.Core/Events/WeakEvent.cs @@ -10,7 +10,13 @@ namespace GFramework.Core.Events; /// 事件数据类型 public sealed class WeakEvent { +#if NET9_0_OR_GREATER + // net9.0 及以上目标使用专用 Lock,以满足分析器对专用同步原语的建议。 + private readonly System.Threading.Lock _lock = new(); +#else + // net8.0 目标仍回退到 object 锁,以保持多目标编译兼容性。 private readonly object _lock = new(); +#endif private readonly EventStatistics? _statistics; private readonly List>> _weakHandlers = new(); @@ -151,4 +157,4 @@ public sealed class WeakEvent var count = _weakHandlers.Count(wr => wr.TryGetTarget(out _)); _statistics.UpdateListenerCount(typeof(T).Name, count); } -} \ No newline at end of file +} diff --git a/GFramework.Core/Property/BindableProperty.cs b/GFramework.Core/Property/BindableProperty.cs index f20ad243..4bbb5a9d 100644 --- a/GFramework.Core/Property/BindableProperty.cs +++ b/GFramework.Core/Property/BindableProperty.cs @@ -12,9 +12,15 @@ namespace GFramework.Core.Property; public class BindableProperty(T defaultValue = default!) : IBindableProperty { /// - /// 用于保护委托链和值访问的锁对象 + /// 用于保护委托链和值访问的同步原语 /// +#if NET9_0_OR_GREATER + // net9.0 及以上目标使用专用 Lock,以满足分析器对专用同步原语的建议。 + private readonly System.Threading.Lock _lock = new(); +#else + // net8.0 目标仍回退到 object 锁,以保持多目标编译兼容性。 private readonly object _lock = new(); +#endif /// /// 属性值变化事件回调委托,当属性值发生变化时被调用 @@ -172,4 +178,4 @@ public class BindableProperty(T defaultValue = default!) : IBindableProperty< { return Value?.ToString() ?? string.Empty; } -} \ No newline at end of file +} diff --git a/GFramework.Core/State/StateMachine.cs b/GFramework.Core/State/StateMachine.cs index f0e8dfa1..8cc85706 100644 --- a/GFramework.Core/State/StateMachine.cs +++ b/GFramework.Core/State/StateMachine.cs @@ -8,7 +8,13 @@ namespace GFramework.Core.State; /// public class StateMachine(int maxHistorySize = 10) : IStateMachine { +#if NET9_0_OR_GREATER + // net9.0 及以上目标使用专用 Lock,以满足分析器对专用同步原语的建议。 + private readonly System.Threading.Lock _lock = new(); +#else + // net8.0 目标仍回退到 object 锁,以保持多目标编译兼容性。 private readonly object _lock = new(); +#endif private readonly HashSet _registeredStates = []; private readonly Stack _stateHistory = new();