浅谈思路严谨的管理软件中的用户在线状态控制【附部分C#参考代码】
2010-09-30 19:12 通用C#系统架构 阅读(3554) 评论(22) 编辑 收藏 举报10.1放假了,希望大家都能度过平平安安快乐的国庆长期,希望写程序的光棍汉同行都能遇上桃花运,早日找到自己的另一半,也希望我刚满月的女儿能健健康康成长,长大了找个优秀的程序员嫁了,哈哈。
我们经常会遇到
1:客户购买了5个用户的许可,10个用户的许可,软件需要限制用户的并发数量,我知道就是Oracle的并发用户达到20个以上,那费用是非常昂贵的。
2:一个用户只能登录一次或者是一个账号在同一时间只能登录一个,若已经是登录了就不让再登录了,需要能控制用户的并发登录问题。
3:有的系统也需要能实现在线用户列表、用户的登录状态等,特别是即时消息功能的内部管理系统等。
先把自己的思路整理图贴出来如下:
C/S的部分参考代码如下:这里为了实现定时获取消息的平滑,利用了线程的方式,这样不影响用户的操作,是多线程实现定时获取消息的。

/// 消息检测的线程
/// </summary>
private Thread MessageThread = null;
this.MessageThread = new Thread(new ThreadStart(this.MessageCheck));
MessageThread.Start();
private void MessageCheck()
{
while (!this.ExitApplication)
{
if (this.FormLoaded && (!this.Busyness))
{
if (this.Tag == null)
{
// 获得新消息
// this.bwGetNewMessage.RunWorkerAsync();
this.GetNewMessage();
this.Tag = true;
}
else
{
// 若已经是最小化、或者被隐藏起来了,就不用获取在线状态,可以提高效率
if ((this.WindowState == FormWindowState.Minimized) || !(this.Visible))
{
// 阅读消息状态
// this.MessageChek();
}
// 获取在线状态列表
// this.bwGetOnLineState.RunWorkerAsync();
this.GetOnLineState();
this.Tag = null;
}
}
Thread.Sleep(1000);
}
}
B/S部分的参考代码如下:
UserOnLine.aspx 页面,专门接收,我还活着的用户的报道,统一呼叫这个页面,表示自己还活着,在线上。
用了javascript 的 setTimeout 功能,定时在服务器上用 ajax 方式进行签到,这样可以正确处理B/S系统的在线情况

function ReloadSession() {
XmlPost("Modules/Common/User/UserOnLine.aspx");
// 每100秒钟刷新一次
// alert("ReloadSession");
setTimeout("ReloadSession()", 1000 * 100);
}
ReloadSession();
</script>
以上只是一个非高科技的,用最传统的方法,最说得通的方式,正确解决在线用户的状态,其中解决了B/S,C/S通用的在线方式问题,突然断电等异常情况下的事务处理在线判断,服务器上,还可以部署在线状态跟踪器等,100%完全正确做到在线状态,还是有点儿小困难,特别是B/S的项目,目前的能力,只能做到近似效果,当然根据实际需要,也可以修改向服务器报道我活着的频率,例如5秒报道一次,那就更接近真实在线情况了,当然在线客户数量很少时,1秒一次也无所谓的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2009-09-30 走火入魔通用权限管理不仅是权限设计更是总体设计规划、快速开发集成平台(集中控制体系)