浅谈思路严谨的管理软件中的用户在线状态控制【附部分C#参考代码】

10.1放假了,希望大家都能度过平平安安快乐的国庆长期,希望写程序的光棍汉同行都能遇上桃花运,早日找到自己的另一半,也希望我刚满月的女儿能健健康康成长,长大了找个优秀的程序员嫁了,哈哈。

 

我们经常会遇到

1:客户购买了5个用户的许可,10个用户的许可,软件需要限制用户的并发数量,我知道就是Oracle的并发用户达到20个以上,那费用是非常昂贵的。

2:一个用户只能登录一次或者是一个账号在同一时间只能登录一个,若已经是登录了就不让再登录了,需要能控制用户的并发登录问题。

3:有的系统也需要能实现在线用户列表、用户的登录状态等,特别是即时消息功能的内部管理系统等。

 

先把自己的思路整理图贴出来如下:

 

C/S的部分参考代码如下:这里为了实现定时获取消息的平滑,利用了线程的方式,这样不影响用户的操作,是多线程实现定时获取消息的。

ExpandedBlockStart.gif 代码
         ///   <summary>
        
///  消息检测的线程
        
///   </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系统的在线情况

ExpandedBlockStart.gif 代码
< script language = " javascript " >
    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秒一次也无所谓的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值