[原创]用线程和单件模式设计用户在线统计和检查

rroo 2006-02-13 05:10:10
设计原理:
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退出,我们是通过扫描线程来判断,是不是该从在线列表中删除该用户
...全文
108 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
rroo 2006-02-13
  • 打赏
  • 举报
回复
当然,用户的每次活动,你都应该去刷新对应用户的最后操作时间
rroo 2006-02-13
  • 打赏
  • 举报
回复
通过那个扫描线程来删除,指定时间内没有活动的用户啊,就象Session超时一样
henryfan1 2006-02-13
  • 打赏
  • 举报
回复
忘了还有就是用户直接在IE中输了别的站点路径离开了?
henryfan1 2006-02-13
  • 打赏
  • 举报
回复
我想知道如何及时发觉用户关闭了IE?
makilyang 2006-02-13
  • 打赏
  • 举报
回复
friendly bump...
rroo 2006-02-13
  • 打赏
  • 举报
回复
其实采用这样的设计,我们完全可以用他来替代Session,而且可以给我们更大的设计灵活性

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧