C# 使用不同的方法启动和完成锁定

C# 使用不同的方法启动和完成锁定,c#,.net,multithreading,locking,parallel-processing,C#,.net,Multithreading,Locking,Parallel Processing,我想——出于模糊的原因,你不应该质疑——在一个方法中启动一个锁,在另一个方法中结束它。不知怎的,就像: object mutex = new object(); void Main(string[] args) { lock (mutex) { doThings(); } } 将具有与以下相同的行为: object mutex = new object(); void Main(string[] args) { Foo(); doTh

我想——出于模糊的原因,你不应该质疑——在一个方法中启动一个锁,在另一个方法中结束它。不知怎的,就像:

object mutex = new object();

void Main(string[] args)
{
    lock (mutex)
    {
        doThings();
    }
}
将具有与以下相同的行为:

object mutex = new object();

void Main(string[] args)
{
    Foo();
    doThings();
    Bar();
}

void Foo()
{
    startLock(mutex);
}

void Bar()
{
    endlock(mutex);
}
当然,问题是lock关键字在块语法中起作用。我知道锁不是用来这样使用的,但我对S/O的创造性和黑客解决方案非常开放。:)

[编辑]

使用
lock
时,在.NET 4的引擎盖下会发生以下情况:

bool lockTaken = false;
try
{
    Monitor.Enter(syncRoot, ref lockTaken);

    // code inside of lock
}
finally
{
    if (lockTaken)
        Monitor.Exit(_myObject);
}    

“由于模糊的原因,你不应质疑”。你想被否决吗?调子不好。@Oded:对不起,我在找幽默的调子。我只是想避免谈论好的设计,因为我知道这不是,并且我完全意识到这一事实。我更愿意看到创造性的解决方案和黑客,这就是为什么这个问题被标记为
黑客
。我对这里使用幽默的人很好,但“你不应该提问”听起来是一个令人讨厌的精英主义者。@Oded:显然,有一种方法是为了满足我的需求(见Alex Aza的回答)。在这种情况下,那个部分是不合适的,我再次道歉。@Oded,@Lazlo:“你不应该”听起来很幽默。要求人们不要把注意力集中在OP问题的这一部分似乎是一种礼貌的方式。好吧,这比预期的要容易得多。From:“在块的开头,
lock
关键字调用
Enter
,在块的末尾调用
Exit
lock
语句只是
Monitor.Enter(x)的语法糖试试{/*work*/}最后{Monitor.Exit(x)}
@Joel在.NET4中它使用了一种不同的构造来避免线程中止的问题。显然,这段代码根本不会处理异常(线程中止尤其有害)。
bool lockTaken = false;
try
{
    Monitor.Enter(syncRoot, ref lockTaken);

    // code inside of lock
}
finally
{
    if (lockTaken)
        Monitor.Exit(_myObject);
}