• [C#]统计在线人数


    鹅用的是AC数据库,曾经在ASP时代试验过,做的使用数据库临时表,人数上了100就比较艰难了(因为同时还在不停的查询另外个BANNER表所以实际上是上了200),后来我飒是费了点劲将数据表转换为多维数组放到APPLICATION里去然后间隔时间更新至数据库,得以缓解。现在而今眼目下鸟枪换炮了用.net可以直接把DataTable放到Application里面。很好。极大减少数据库压力了,尤其是我使用的AC数据库-_-!。至于要实现1个ID1个登陆只要查询表中是否有该用户名的记录就可以了。
    还没完善目前还在调试修正中。。。

    在BasePage或每个页中加入(new ZKXP.BLL()).CheckOnline()即可。
    要获得数据表使用DataTable dt = (DataTable)Application["OnlineTable"]

    using System;
    using System.Data;
    using System.Text;

    namespace ZKXP.BLL
    {
        
    /// <summary>
        
    /// OnLine 的摘要说明。
        
    /// </summary>
        public class OnLine
        {    
            
    private string USERNAME;
            
    private int OFFLINEDIFF;
            
    private int REMOVEDIFF;
            

            
    public OnLine()
            {
                
    //直接在这里设定、或从配置文件中读取配置参数
                ///存放用户名的Session名
                USERNAME = "UserName";
                
    ///多少分钟不活动的用户从在线列表中删除
                OFFLINEDIFF = 5;
                
    ///多少秒执行一次删除不活动用户
                REMOVEDIFF = 30;
                
                
    if(System.Web.HttpContext.Current.Application["OnlineTalbe"== null)
                {
                    
    this.CashTableInit();
                }
            }

            
    public void CheckOnline()
            {
                
    //从Application获取数据表、获取SessionID
                DataTable dtOnline;
                dtOnline 
    = (DataTable)System.Web.HttpContext.Current.Application["OnlineTalbe"];
                
    string sessionId = System.Web.HttpContext.Current.Session.SessionID.ToString();
                
                
    //数据表中是否有我的记录
                DataRow drFind = dtOnline.Rows.Find(sessionId);
                
    if(drFind != null)
                {
                    
    //有;更新我的状态
                    Info.Write("更新");
                    drFind[
    "LastActiveTime"= DateTime.Now;
                    drFind[
    "UserWhere"= this.AtWhere;
                    
    //用户由访客状态变为了登陆会员、或反之
                    if(Extend.GetSession(USERNAME) != null)
                    {
                        drFind[
    "VisitorName"= Extend.GetSession(USERNAME);
                        drFind[
    "VisitorLevel"= Extend.GetSession("UserLevel");
                    }
                    
    else
                    {
                        drFind[
    "VisitorName"= "vst";
                        drFind[
    "VisitorLevel"= -1;
                    }    
                }
                
    else
                {
                    
    //无;加入关于我的在线信息
                    Info.Write("插入");
                    DataRow drNew 
    = dtOnline.NewRow();
                    drNew[
    "SessionID"= sessionId;
                    drNew[
    "VisitorName"= "vst";
                    drNew[
    "VisitorLevel"= -1;
                    drNew[
    "LastActiveTime"= DateTime.Now;
                    drNew[
    "LoginTime"= DateTime.Now;
                    drNew[
    "VisitorIP"= Extend.GetRealIP();;
                    drNew[
    "UserWhere"= this.AtWhere;
                    
                    dtOnline.Rows.Add(drNew);                
                }
                
    //如果没有人正在执行删除且离上次删除的时间间隔超过设定值
                TimeSpan tsRemove = DateTime.Now - Convert.ToDateTime(GetApplication("LastRemove"));
                
    if(tsRemove.Seconds > REMOVEDIFF && this.GetApplication("Removing").ToString() == "n")
                {
                    
    //锁定,我正在删除过期用户
                    System.Web.HttpContext.Current.Application.Lock();
                    SetApplication(
    "Removing""y");
                    System.Web.HttpContext.Current.Application.UnLock();
                    
    //不知道Rows.Count是否随循环减少,如果是效率就大于foreach且这里不能使用foreach
                    for(int i=0; i< dtOnline.Rows.Count; i++ )
                    {
                        DataRow drDel 
    = dtOnline.Rows[i];
                        TimeSpan ts
    = DateTime.Now - Convert.ToDateTime(drDel["LastActiveTime"]);
                        
    if(ts.Minutes > OFFLINEDIFF)
                        {
                            dtOnline.Rows.Remove(drDel);
                        }
                    }

                    
    //我删完了,Response.Write("好累") ;
                    System.Web.HttpContext.Current.Application.Lock();
                    SetApplication(
    "Removing""n");
                    SetApplication(
    "LastRemove", DateTime.Now.ToString());
                    System.Web.HttpContext.Current.Application.UnLock();
                }
                
                
    //把被我揉腻完了的数据表放回Application
                dtOnline.AcceptChanges();
                System.Web.HttpContext.Current.Application.Lock();
                System.Web.HttpContext.Current.Application[
    "DataTalbeOnline"= dtOnline;
                System.Web.HttpContext.Current.Application.UnLock();            
            }
            
    private string GetApplication(string apcname)
            {
                
    return System.Web.HttpContext.Current.Application[apcname].ToString();
            }
            
    public void SetApplication(string apcname, string apcvalue)
            {
                
                System.Web.HttpContext.Current.Application[apcname] 
    = apcvalue;
                
            }
            
    /// <summary>
            
    /// 返回用户当前位置
            
    /// </summary>
            private string AtWhere
            {
                
    get
                {    System.Text.StringBuilder sb 
    = new System.Text.StringBuilder();
                    sb.Append(System.Web.HttpContext.Current.Request.ServerVariables[
    "url"]);
                    
    if(System.Web.HttpContext.Current.Request.ServerVariables["QUERY_STRING"!= String.Empty)
                    {
                        sb.Append(
    "?");
                        sb.Append(System.Web.HttpContext.Current.Request.ServerVariables[
    "QUERY_STRING"]);
                    }
                    
    return sb.ToString() ;
                }
            }
            
    /// <summary>
            
    /// 创建表
            
    /// </summary>
            public void CashTableInit()
            {    
                DataTable dt 
    = new DataTable("OnlineTalbe");
                dt.Columns.Add(
    "SessionID",typeof(string));
                dt.Columns.Add(
    "VisitorName"typeof(string));
                dt.Columns.Add(
    "VisitorLevel"typeof(int));
                dt.Columns.Add(
    "LastActiveTime"typeof(DateTime));
                dt.Columns.Add(
    "LoginTime"typeof(DateTime));
                dt.Columns.Add(
    "VisitorIP"typeof(string));
                dt.Columns.Add(
    "UserWhere"typeof(string));
                dt.Columns[
    "SessionID"].Unique = true;
                dt.PrimaryKey 
    = new DataColumn[]{dt.Columns["SessionID"]};
                            
                System.Web.HttpContext.Current.Application[
    "OnlineTalbe"= dt;
                System.Web.HttpContext.Current.Application[
    "LastRemove"= DateTime.Now.ToString();
                System.Web.HttpContext.Current.Application[
    "Removing"= "n";
            }    
        }
    }
  • 相关阅读:
    NHibernate使用
    成为专业程序员路上用到的各种优秀资料、神器及框架
    SignalR
    sql 语句 事务
    entity framework 数据加载三种方式的异同(延迟加载,预加载,显示加载)
    获取前一个页面的地址
    给button按钮加回车事件
    单元测试
    教学资源网站整理
    Go资源
  • 原文地址:https://www.cnblogs.com/zkxp/p/363438.html
Copyright © 2020-2023  润新知