void MethodA()
{
Monitor.Enter(this);
if(someCondition)
{
Monitor.Exit(this);
// This point
MethodB();
}
else
{
// Set some values only
Monitor.Exit(this);
}
}
如果我有上面的方法可以在多线程中调用:
//This point
Monitor.Enter
,而帖子1仍在//This point
MethodB
被执行吗?如果是,是否有办法让MethodB
执行。我需要在执行MethodA
之前释放MethodB()
,因为我在发布MethodB
之前不能等MethodA
完成。另外,我无法在新主题中启动MethodB
。
答案 0 :(得分:8)
抛开使用'this'作为锁的问题(不好的做法,因为它公开地公开了锁),这个表单更干净,更安全(如果抛出异常则释放锁):
void MethodA()
{
bool condition;
lock(this)
{
condition = someCondition;
if(!condition)
{
// Set some values only
}
}
if (condition)
MethodB();
}
要回答您的具体问题,此代码和原始代码都将执行MethodB,即使其他内容获取了锁定。
答案 1 :(得分:1)
因为someCondition不是作为参数传递的,所以我只能假设someCondition可以随时改变(可能是类的实例变量)。所以,我会这样编写代码:
void MethodA()
{
if (someCondition)
{
bool conditionReached = false;
Monitor.Enter(this);
try
{
if (someCondition)
{
conditionReached = true;
}
}
finally
{
Monitor.Exit(this);
}
if (conditionReached)
{
MethodB();
}
}
}
如果没有,那么本地宣布的condition
之前的答案将适合您。