如何在多线程应用程序中使用相同的登录会话

时间:2012-04-09 18:43:26

标签: c# multithreading

假设我有一个需要记录的服务才能访问它。有一个功能:

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%语法和语法正确,但你明白了。

0 个答案:

没有答案