You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:03:16