Skip to main content
 首页 » 编程设计

c#之如何创建一个使用模式如锁的方法

2024年02月06日29mengfanrong

我如何在 C# 中创建类似 lock 的方法

即锁的模式是

lock(inputParam) 
{ 
   // code here 
} 

我想创建一个具有类似使用模式的类似方法,在内部执行括号之间代码前后的一些代码,

SomeFunc(InputParam) 
{ 
   // Do some stuff 
} 

lock 是 C# 中的特例,还是我们可以使用某种 lambda/action dark magic 获得类似的结果?

请您参考如下方法:

没有黑魔法。你想要的是 try/finally:

DoSomething(); 
try 
{ 
    // lots of stuff here 
} 
finally 
{ 
    // do other stuff 
} 

我想您可以编写一个方法来为您完成:

void DoTryFinally(Action start, Action stuff, Action final) 
{ 
    start(); 
    try 
    { 
        stuff(); 
    } 
    finally 
    { 
        final(); 
    } 
} 

并调用它:

DoTryFinally( 
    () => { /* start stuff here */ }, 
    () => { /* stuff here */ }, 
    () => { /* final stuff here */ }); 

不过,我建议采用第一种方式:try/finally 是 C# 中的常见习惯用法。

顺便说一下,您发布的代码:

lock (someObject) 
{ 
    // do stuff 
} 

实际上只是本质上的简写:

Monitor.Enter(someObject); 
try 
{ 
    // do stuff 
} 
finally 
{ 
    Monitor.Exit(someObject); 
} 

编译器在编译 lock 语句时生成它。

编译器中没有内置工具可让您使用任意函数执行此操作。 Dispose pattern接近,但这不是一个通用的解决方案。