Skip to main content
 首页 » 编程设计

c#之如何优雅地编写锁{}

2024年01月21日31lautakyan007

在我的多线程项目(C#3.5)中,我有许多与此类似的代码:

    Map map; 
    lock ( _maps ) 
    { 
        map = _maps.First( i => i.ID == arg.MapID ); 
    } 

在我看来,这很丑陋。需要太多行来进行简单检索...

我想要的是这样一个简单的行代码:
    Map map = _maps.First( i => i.ID == arg.MapID ); 

但是带锁:(不起作用)
    Map map = lock( _maps ){ _maps.First( i => i.ID == arg.MapID ) }; 
 
    Map map = delegate(){ lock( _maps ) return _maps.First( i => i.ID == arg.MapID ) }; 

任何帮助将不胜感激 :)
谢谢

请您参考如下方法:

更好的是,只需对Object而不是IEnumerable<T>设置扩展方法:

public static T LockAndExecute<T>(this Object obj, Func<T> operation) 
{ 
    lock(obj) 
    { 
        return operation(); 
    } 
} 

这样不仅可以使您的案子优雅
Map map = _maps.LockAndExecute(() =>  _maps.First(i => i.ID == arg.MapID); 

但是无论您在锁中做什么,都可以重用它。