假设我有一个需要记录的服务才能访问它。有一个功能:
void Login(LoginInfo info);
实现服务的登录逻辑。还有一个功能:
void RequestServiceToDoSomething(RequestInfo info);
Login函数发送Credentials并检索随后由每个RequestServiceToDoSomething使用的SessionId。如果由于某种原因,SessionId变得无效,则RequestServiceToDoSomething会抛出异常。
当你必须处理一个单独的线程时,这非常简单。当多个线程想要使用相同的SessionId来执行请求时,会出现问题。
到目前为止,我解决这个问题的方法是:
class Foo {
...
private object SessionId;
private DateTime LastSuccessfullLogin;
private const int LoginValidPeriod = 5;
...
public void Login(LoginInfo)
{
lock (LastSuccessfullLogin) {
if ((DateTime.Now - LastSuccessfullLogin).Seconds < LoginValidPeriod)
return;
}
lock (Logging) {
if (Logging == true)
return;
else
Logging = true;
AquireWriteLock();
}
try {
// DO STUFF THAT UPDATE SessionId
lock (LastSuccessfullLogin) {
LastSuccessfullLogin = DateTime.Now;
}
}
finally {
lock (Logging) {
Logging = false;
}
ReleaseWriteLock();
}
}
...
void RequestServiceToDoSomething(RequestInfo info) {
try {
AquiareReadLock();
// DO REQUEST BASED ON SessionId
}
finally {
ReleaseWriteLock();
}
}
我的问题是,如果需要进行LastSuccessfullLogin检查,并且此模式是否阻止了不需要的登录执行。是否有更有效和直接的模式?
P.S。提供的代码不是100%语法和语法正确,但你明白了。