设计原理:
      1 .通过单件模式,保证系统中某个类具有唯一实例,用这个实例类来管理在线用户
      2 .用线程背景执行来间隔扫描用户状态,并且做相应处理。
方法:
      1 . 用户状态类的设计
using System;
public class User
{
    //用户Id
    private int userId = -1;
    //用户名
    private string userName = "";
    //用户最后一次活动时间
    private DateTime lastOperateTime = DateTime.Now;
    public User()
    {
    }
    public int UserId
    {
        get
        {
            return userId;
        }
        set
        {
            userId = value;
        }
    }
    public string UserName
    {
        get
        {
            return userName;
        }
        set
        {
            userName = value;
        }
    }
    public DateTime LastOperateTime
    {
        get
        {
            return lastOperateTime;
        }
        set
        {
            lastOperateTime = value;
        }
    }
}
     2.用户管理类的设计
       using System;
using System.Collections;
using System.Threading;
public class UserManager
{    
    private static UserManager userManager;   
    private static object locked = typeof(UserManager);    
    private Hashtable userTable = new Hashtable();
    //用户在线检查周期(分钟)
    private static int userCheckCycle = 1;
    //用户超时周期(分钟)
    private static int userTimeOutCycle = 30;
    private UserManager()
    {
    }
    public UserManager GetInstance()
    {
        lock (locked)
        {
            if (userManager == null)
            {
                userManager = new UserManager();
            }
            return userManager;
        }
    }
    //启动扫描线程
    public void StartScan()
    {
        Thread scanThread = new Thread(new ThreadStart(ScanUser));
        scanThread.IsBackground = true;
        scanThread.Start();
    }
    //扫描线程实际执行逻辑
    private void ScanUser()
    {
        while (true)
        {
            try
            {
                ICollection keys = userTable.Keys;
                foreach (int key in keys)
                {
                    User user = (User)(userTable[key]);
                    //假如用户最后操作周期大于设定周期的话,将用户从列表中移除
                    if (user.LastOperateTime.AddMinutes(userTimeOutCycle) < DateTime.Now)
                    {
                        userTable.Remove(key);
                    }
                }
                //线程睡眠设定时间
                System.Threading.Thread.Sleep(userCheckCycle *1000*60);
            }
            catch { }
        }
    }   
    //添加用户到在线列表
    public void AddUser(User user)
    {
        userTable[user.UserId] = user;
    }
    //从在线用户列表中删除指定用户
    public void DeleteUser(int userId)
    {
        userTable.Remove(userTable);
    }    public Hashtable UserList
    {
        get
        {
            return userTable;
        }
    }
}
     3.下面开始使用这个设计
       a.在Application_Start函数中启动线程  
       void Application_Start(object sender, EventArgs e) 
        { 
            UserManager.GetInstance().StartScan();  
         }
       b.获取在线用户的列表
       HashTable userList = UserManager.GetInstance().UserList ;
       c.登陆的时候执行
       User user = new User();
       user.UserId = ...;
       user.UserName = ".....";
       UserManager.GetInstance().AddUser(user);
       d.退出的时候执行
       UserManager.GetInstance().DeleteUser(userId);
       将用户从在线列表中移除
 其他说明:
       假如用户非法关闭IE退出,我们是通过扫描线程来判断,是不是该从在线列表中删除该用户