用户在线统计实现

 

这两天做网站有个好友系统,需要检测用户在线与离线状态。自己想了个解决办法,主要是通过全局变量(hsUserOnLine ),保存用户在线状态,再开启一个系统线程不停的检测这个在线列表(hsUserOnLine ),而客户端在用户登录之后开启一个由界面引发的线程,不断更新这个全局变量(hsUserOnLine )中对应自己的在线状态。一下为主要步骤:

1.在Global.asax中建立全局Hashtable hsUserOnLine ,并建立外部访问属性HsUserOnline。

     // 创建同步全局hashtable存放用户在线状态
     private   static  Hashtable hsUserOnLine  =  Hashtable.Synchronized( new  Hashtable());

    
    
/// <summary>
    
/// 用户在线列表(Key:用户ID,在线状态:0,1;离线状态:null,-1)
    
/// </summary>

     public  Hashtable HsUserOnline
    
{
        
get
        
{
            
return hsUserOnLine;
        }

        
set
        
{
            hsUserOnLine 
= value;
        }

    }

 

2.在系统启动时开启系统线程不停的监听hsUserOnLine,没过一段时间将hsUserOnLine中的键值对值为"1"的置"0",值为"0"的置"-1",值为"-1"的清除。

Application_Start事件中添加启动线程

    System.Threading.Thread thListenUsers  =   new  System.Threading.Thread(ListenUserOnlineStatus);
    thListenUsers.Start();

线程调用的函数ListenUserOnlineStatus

     /// <summary>
    
/// 监听程序
    
/// </summary>

     private   void  ListenUserOnlineStatus()
    
{
        
try
        
{
            
while (true)
            
{
                hstemp 
= new Hashtable();
                
lock (hsUserOnLine.SyncRoot)
                
{
                    
foreach (DictionaryEntry tempitem in hsUserOnLine)
                    
{
                        
if (tempitem.Value.ToString() == "1")
                        
{
                            hstemp.Add(tempitem.Key, 
"0");
                        }

                        
else if (tempitem.Value.ToString() == "0")
                        
{
                            hstemp.Add(tempitem.Key, 
"-1");
                        }

                    }

                    hsUserOnLine 
= Hashtable.Synchronized(hstemp);
                }


                System.Threading.Thread.Sleep(
6000);
            }

        }

        
catch
        
{
            
        }

        
    }

 3.用户登录时,对hsUserOnLine中加入改用户记录,将值设为"1",并启动线程定期刷新(将值重置为"1")

添加在线记录

     lock  (ApplicationInstance.HsUserOnline.SyncRoot)
    
{
        ApplicationInstance.HsUserOnline.Remove(userId);
        ApplicationInstance.HsUserOnline.Add(userId, 
"1");
    }

线程不断增加在线记录

lock  (ApplicationInstance.HsUserOnline.SyncRoot)
{
    
string userstatus = Convert.ToString(ApplicationInstance.HsUserOnline[userId.ToString()]);

    
if (string.IsNullOrEmpty(userstatus))
    
{
        ApplicationInstance.HsUserOnline.Add(userId.ToString(), 
"1");
    }

    
else if (userstatus != "1")
    
{
        ApplicationInstance.HsUserOnline.Remove(userId.ToString());
        ApplicationInstance.HsUserOnline.Add(user.userId.ToString(), 
"1");
     }

}

 

注:其中涉及到线程,我用锁机制,利用hashtable的SyncRoot属性对hashtable进行加锁。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值