设计原理:
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退出,我们是通过扫描线程来判断,是不是该从在线列表中删除该用户
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退出,我们是通过扫描线程来判断,是不是该从在线列表中删除该用户
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货