C#:如何在lock代码块内整洁声明并赋值变量?
优化带锁的LINQ代码的优雅写法
你可以通过以下几种方式优化代码,在保证线程安全的同时保持简洁性:
方案1:合并变量声明与锁块(直观易读)
将变量声明和锁块逻辑整合,同时添加大括号明确锁保护的范围(避免后续扩展代码时出现逻辑疏漏):
var dates = new List<DateTime>(); lock (League) { dates = League.AllGames.Select(g => g.Time.Date).Distinct().ToList(); }
这种写法保留了var的简洁性,同时清晰展示了线程安全的边界,可读性很强。
方案2:封装通用锁方法(复用性更强)
如果代码中有多处需要加锁执行逻辑的场景,可以封装一个通用辅助方法,分离锁逻辑与业务逻辑:
// 通用锁辅助方法 private T ExecuteWithLock<T>(object lockObject, Func<T> action) { lock (lockObject) { return action(); } } // 调用示例 var dates = ExecuteWithLock(League, () => League.AllGames.Select(g => g.Time.Date).Distinct().ToList());
这种方式把锁的逻辑抽象出来,业务代码回归到类似原单行代码的简洁性,同时大幅提升了代码复用性。
关键注意事项
- 确保锁定的对象(这里是
League)是私有且只读的,避免外部代码修改该对象导致锁机制失效; - LINQ的
Select和Distinct操作依赖枚举AllGames,必须将整个枚举过程放在锁块内,才能彻底避免System.InvalidOperationException异常。
内容的提问来源于stack exchange,提问作者Doug Burbidge
相关产品推荐
相关产品推荐

