我如何创建一个使用模式像锁的方法

本文关键字:模式 方法 何创建 创建 一个 | 更新日期: 2023-09-27 18:08:39

如何在c#中创建一个类似lock的方法

。锁的模式是

lock(inputParam)
{
   // code here
}

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

SomeFunc(InputParam)
{
   // Do some stuff
}

是锁在c#中的特殊情况,或者我们能够实现类似的结果与某种lambda/action黑魔法?

我如何创建一个使用模式像锁的方法

禁止使用黑魔法。你想要的是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模式很接近,但它不是通用的解决方案。

lock只是有一点特殊:它在c#规范中提到,但等同于你可以编写的代码(参见规范的§8.12)。你可以做一些类似的事情:

void Main()
{
    SomeFunc(2, () => {
        //do stuff
    });
}
public void SomeFunc(int inputParam, Action body)
{
    //do before stuff
    body();
    // do after stuff
}
然而,这样的模式听起来很不寻常。在假设这是一个好方法之前,我会看看是否有更好的方法来做我想做的事情。