如果你突破Lock()语句会发生什么?

dlr*_*as2 11 .net c# multithreading locking tcpclient

我正在编写一个程序,它监听传入的TcpClient并在数据到达时处理数据.该Listen()方法在组件内的单独线程上运行,因此它需要是线程安全的.如果我在一个声明中break出了do while循环lock(),锁定会被释放吗?如果没有,我该如何做到这一点?

谢谢!

(关于异步TCP套接字主题的任何其他建议也是受欢迎的.)

private void Listen()
{
    do
    {
        lock (_clientLock)
        {
            if (!_client.Connected) break;
            lock (_stateLock)
            {
                if (!_listening) break;
                if (_client.GetStream().DataAvailable) HandleData();
            }
        }
        Thread.Sleep(0);
    } while (true);
}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 21

是.lock语句转换为try/finally子句.例如,在C#4中,锁定语句如下:

lock(obj)
{
    // body
}
Run Code Online (Sandbox Code Playgroud)

大致翻译(摘自Eric Lippert的博客):

bool lockWasTaken = false;
var temp = obj;
try 
{ 
    Monitor.Enter(temp, ref lockWasTaken); 
    { 
       // body 
    }
}
finally 
{ 
    if (lockWasTaken) 
        Monitor.Exit(temp); 
}
Run Code Online (Sandbox Code Playgroud)

当执行离开范围时lock {},底层锁将自动释放.无论你如何退出范围(break/return/etc),都会发生这种情况,因为对Monitor.Exit的调用是在try/finally的finally块内部包装的.