首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包

ASP.NET架构师 [加入]

乐观 协作 热情 专业(QQ群:38697281)
怎么样判断在线人数?
发表时间:2008-04-24 16:16:33   楼主:sryughy
用session不太准确.有没有什么好的方法



 
发表时间:2008-04-25 08:14:34 1 楼:boyd1985
Application
发表时间:2008-05-12 15:11:46 2 楼:yehaiping1214

 添加全局应用程序类Global.asax 

 <script runat="server">

    void Application_Start(object sender, EventArgs e)
    {
        // 在应用程序启动时运行的代码
        Application["userNum"] = 0;
    }
   
    void Application_End(object sender, EventArgs e)
    {
        //  在应用程序关闭时运行的代码
        Application["userNum"] = 0;
        Application.RemoveAll();
    }
       
    void Application_Error(object sender, EventArgs e)
    {
        // 在出现未处理的错误时运行的代码

    }

    void Session_Start(object sender, EventArgs e)
    {
        // 在新会话启动时运行的代码
        Application.Lock();
        Application["userNum"] = (int)Application["userNum"] + 1;
        Application.UnLock();
    }

    void Session_End(object sender, EventArgs e)
    {
        // 在会话结束时运行的代码。
        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
        // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
        // 或 SQLServer,则不会引发该事件。
        Application.Lock();
        Application["userNum"] = (int)Application["userNum"] - 1;
        Application.UnLock();
    }
      
</script> 

 

 

 

Default.aspx页面显示:

 

Page_Load中:

 

   //显示在线人数及名称
   string strOnLine = "";
   strOnLine += "在线人数" + " " + Application["userNum"].ToString();

 

发表时间:2008-05-15 20:26:51 3 楼:Aaron615
用Session 的办法不准确, 当用户关闭浏览器退出,Session的值不会立刻减1.
发表时间:2008-05-17 16:06:51 4 楼:yehaiping1214

也可以解决的

在Global.asax 中写

 

const long timerdelay = 1000;//定义超时时间为1秒

System.Threading.Timer timer;

object syncRoot = new object();

 

 

TimerCallback OnTimerTick = new TimerCallback(TimerTick);
timer = new System.Threading.Timer(OnTimerTick, null, timerdelay, timerdelay);

 

 // 检查用户是否超时,添加在线用户名单

    private void TimerTick(object state)
    {
        lock (syncRoot)
        {

             string[] current = new string[users.Keys.Count];
             users.Keys.CopyTo(current, 0);
             foreach (string guid in current)   

             {
                if (!pings.Contains(guid))
                {
                    users.Remove(guid);
                }
            }
            pings.Clear();
        }
    }

 

这样关闭浏览器时,Session的值会减1

你可以试试看

 

发表时间:2008-06-09 10:55:15 5 楼:flyshuang

这个Session有个默认时间是在20分钟——在20分钟之后才会得去反应,可以到iis里面.config 的<sessionState timeOut="你自己想要的时间" 还可以用属性 Session.Timeout = "";

不过要立即显示退去系统,者在Pageload事件里面加上 Session.Abandon()方法——

本回复于:
2008-06-09 14:20:51 被【flyshuang】修改
发表时间:2008-06-09 11:31:18 6 楼:iforelse

技术视频网站,让您轻松学习技术

Http://www.zzgps.cn

 [img=http://www.zzgps.cn/hudong/UpFiles/Slide/1.jpg][/img]

发表时间:2008-06-25 18:19:13 7 楼:maomao171314
application
发表时间:2008-06-26 10:04:53 8 楼:hiip456123

解说专家

【相关链接】: http://www.91sfq.cn/ (本网站不保证链接的安全性)
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|版权声明|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo