我有一个服务,它在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 个方法调用吗?
您可以使用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();
}
}
需要明确的是,如果非常频繁地调用此代码,则可能会有问题,因为它会减慢必须等待互斥锁的所有其他线程的速度。
恕我直言,如果"独特"错误没什么大不了的,我认为你可以坚持下去;它可能很无聊,但有时尝试失败比等待互斥释放并减慢一切更好。