添加全局应用程序类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();
也可以解决的
在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
你可以试试看
这个Session有个默认时间是在20分钟——在20分钟之后才会得去反应,可以到iis里面.config 的<sessionState timeOut="你自己想要的时间" 还可以用属性 Session.Timeout = "";
不过要立即显示退去系统,者在Pageload事件里面加上 Session.Abandon()方法——
2008-06-09 14:20:51 被【flyshuang】修改
