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);
}