我正在尝试将此C ++代码转换为C#:
do{
if (Node->NextNode == NULL) WaitForSingleObject(pThis->_Event, INFINITE);
_critSect.Lock();
if (Node->NextNode == NULL && !bRunning )
{
_critSect.Unlock(); // can explicitly unlock here
break;
}
_critSect.Unlock();
}while (Node->NextNode == NULL);
在C ++中,我可以显式解锁线程,但C#只有一个括号。如何在破解之前在下面的代码中添加“解锁”功能?
do{
if (Node->NextNode == null) DataQueueEvent.WaitOne();
lock (thisLock)
{
if (Node->NextNode == null && !bRunning)
// need to unlock here!!!
break;
}
} while (Node->NextNode == null);
答案 0 :(得分:6)
这根本不必要。在C#中,lock
语句转换为try
/ finally
,因此无论您如何退出块,只要退出块,锁就会被释放,,因此,当您使用break
路径退出时,无需明确释放锁定。
答案 1 :(得分:2)
除了servy所说的内容之外,如果你想看看这是如何在幕后完成的,请看看link
锁定语句将在编译后转换为
bool acquiredLock = false;
try
{
Monitor.Enter(lockObject, ref acquiredLock);
// Code that accesses resources that are protected by the lock.
}
finally
{
if (acquiredLock)
{
Monitor.Exit(lockObject);
}
}