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块内部包装的.