System.Threading.Lock向后兼容问题:多.NET框架目标下的实现困惑
.NET 9
System.Threading.Lock 兼容旧框架的优雅方案 .NET 9引入的System.Threading.Lock相比传统基于object的lock语句有明显性能优势,但直接在业务代码里用预处理器指令适配旧框架会导致代码杂乱无章。可以通过封装统一锁工具类的方式,把条件编译逻辑集中管理,让业务代码保持整洁。
单例锁工具类(适合全局共享锁场景)
把锁逻辑封装到静态类中,业务代码只需调用统一方法,无需关心底层实现:
public static class LockHelper { #if NET9_0_OR_GREATER private static readonly System.Threading.Lock _internalLock = new(); #else private static readonly object _internalLockObj = new object(); #endif // 执行无返回值的锁定逻辑 public static void RunLocked(Action action) { #if NET9_0_OR_GREATER using (_internalLock.Enter()) { action(); } #else lock (_internalLockObj) { action(); } #endif } // 执行带返回值的锁定逻辑 public static T RunLocked<T>(Func<T> func) { #if NET9_0_OR_GREATER using (_internalLock.Enter()) { return func(); } #else lock (_internalLockObj) { return func(); } #endif } }
业务代码调用示例:
// 无返回值场景 LockHelper.RunLocked(() => { // 你的线程安全逻辑 }); // 带返回值场景 var result = LockHelper.RunLocked(() => { // 计算并返回线程安全的结果 return 123; });
可实例化锁包装类(适合多独立锁场景)
如果需要多个互不干扰的锁(比如不同业务模块的独立锁),可以封装可实例化的类:
public class LockWrapper { #if NET9_0_OR_GREATER private readonly System.Threading.Lock _internalLock = new(); #else private readonly object _internalLockObj = new object(); #endif public void RunLocked(Action action) { #if NET9_0_OR_GREATER using (_internalLock.Enter()) { action(); } #else lock (_internalLockObj) { action(); } #endif } public T RunLocked<T>(Func<T> func) { #if NET9_0_OR_GREATER using (_internalLock.Enter()) { return func(); } #else lock (_internalLockObj) { return func(); } #endif } }
业务代码使用示例:
// 初始化不同的锁实例 var orderLock = new LockWrapper(); var inventoryLock = new LockWrapper(); // 订单模块锁定逻辑 orderLock.RunLocked(() => { // 订单处理逻辑 }); // 库存模块锁定逻辑 inventoryLock.RunLocked(() => { // 库存扣减逻辑 });
注意事项
- 确保项目文件中正确配置多目标框架,比如:
<TargetFrameworks>net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
- 若需更细粒度的锁定(比如读写锁),可以扩展工具类,分别适配
System.Threading.Lock的读写模式和旧框架的ReaderWriterLockSlim。
内容的提问来源于stack exchange,提问作者Ph3n0m
相关产品推荐
相关产品推荐

