我有一个服务,它在sql表中本地查找值。如果该值不存在,则进行远程调用。如果远程调用返回了一个值,则将该值添加到本地sql表中。
我已在日志文件中通知了字符串值XXX已存在的唯一索引例外。
对我来说,这意味着发生了以下情况:
Request1_localSqlCheck
Request1_remoteCheck
Request2_localSqlCheck
Request2_remoteCheck
Request1_AddValueLocallyIfRecievedByRemote
Request2_AddValueLocallyIfRecievedByRemote // Same value Added here causes exception.
我想让所有3个步骤原子并锁定它:
Lock
{
Request1_localSqlCheck
Request1_remoteCheck
Request1_AddValueLocallyIfRecievedByRemote
}
这是否可以锁定这3个方法调用?
答案 0 :(得分:0)
您可以使用Mutex
来阻止代码执行,直到服务器返回值。
例如:
private readonly Mutex m = new Mutex();
public int ThreadSafeMethod() {
// you can do this immediately to skip the mutex
if (Request1_localSqlCheck == 1) return 1;
m.WaitOne();
try {
// check again
if (Request1_localSqlCheck == 1) return 1;
Request1_remoteCheck
Request1_AddValueLocallyIfRecievedByRemote
} finally {
m.ReleaseMutex();
}
}
为了清楚起见,如果非常频繁地调用此代码,则可能会出现问题,因为它会减慢必须等待互斥锁的所有其他线程。
恕我直言,如果"独特"错误不是什么大问题,我认为你可以坚持下去;它可能很无聊,但有时尝试失败比等待互斥释放更慢并且减慢一切。