在线人数统计

摘要:
dtOnline=(DataTable)System.Web.HttpContext.Current.Application[“DataTalbeOnline”];drNew[“UserName”]=用户名;i++){DataRowdrDel=dtOnline.Rows[i];

/// <summary>
/// OnLine 的摘要说明
/// </summary>
public class OnLine
{
private int OFFLINEDIFF;
private int REMOVEDIFF;


public OnLine()
{
///多少分钟不活动的用户从在线列表中删除
OFFLINEDIFF = 5;
///多少秒执行一次删除不活动用户
REMOVEDIFF = 30;

if (System.Web.HttpContext.Current.Application["DataTalbeOnline"] == null)
{
this.CashTableInit();
}
}

public void CheckOnline(string UserId,string UserName)
{
//从Application获取数据表、获取UserId
DataTable dtOnline;
dtOnline = (DataTable)System.Web.HttpContext.Current.Application["DataTalbeOnline"];

//数据表中是否有我的记录
DataRow drFind = dtOnline.Rows.Find(UserId);
if (drFind != null)
{
drFind["LastActiveTime"] = DateTime.Now;
}
else
{
DataRow drNew = dtOnline.NewRow();
drNew["UserId"] = UserId;
drNew["UserName"] = UserName;
drNew["LastActiveTime"] = DateTime.Now;
drNew["LoginTime"] = DateTime.Now;

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>
public void CashTableInit()
{
DataTable dt = new DataTable("OnlineTalbe");
dt.Columns.Add("UserId", typeof(string));
dt.Columns.Add("UserName", typeof(string));
dt.Columns.Add("LastActiveTime", typeof(DateTime));
dt.Columns.Add("LoginTime", typeof(DateTime));
dt.Columns["UserId"].Unique = true;
dt.PrimaryKey = new DataColumn[] { dt.Columns["UserId"] };

System.Web.HttpContext.Current.Application["DataTalbeOnline"] = dt;
System.Web.HttpContext.Current.Application["LastRemove"] = DateTime.Now.ToString();
System.Web.HttpContext.Current.Application["Removing"] = "n";
}
}

免责声明:文章转载自《在线人数统计》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇AOP拦截器 SpringBoot可以直接导入spring-boot-starter-aop编写AOP拦截器,实现业务层拦截。bootstrap-图文混排 media下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

android 应用在启动后进行全局的的初始化操作

例如对于Volley的使用: 1:定义一个类使其继承Application package com.wzh.app; import com.wzh.volley.WzhVolley; import android.app.Application; import android.util.Log; public class WzhShshtA...

Spark History Server配置使用

Spark history Server产生背景 以standalone运行模式为例,在运行Spark Application的时候,Spark会提供一个WEBUI列出应用程序的运行时信息;但该WEBUI随着Application的完成(成功/失败)而关闭,也就是说,Spark Application运行完(成功/失败)后,将无法查看Application...

报错:(未解决)Opening socket connection to server master/192.168.52.26:2181. Will not attempt to authenticate using SASL (unknown error)

报错背景: CDH集群中,将kafka和Flume整合,将kafka的数据发送给Flume消费。 启动kafka的时候正常,但是启动Flume的时候出现了报错现象。 报错现象: DH-5.15.1-1.cdh5.15.1.p0.4/lib/hadoop/lib/native:/opt/cloudera/parcels/CDH-5.15.1-1.cdh5....

VSTO:使用工作簿

一、新建工作簿 以编程方式创建工作簿时,所创建的将是一个本机Microsoft.Office.Interop.Excel.Workbook对象,而不是Microsoft.Office.Tools.Excel.Workbook宿主项。 1.单击工作表中的按钮新建工作簿 在工作簿Sheet1中新建一个按钮,在按钮的单击事件中编写以下代码新建一个工作簿: usi...

VBA Excel 打印

1. 设置 页边距、打印区域 With .PageSetup  .HeaderMargin = Application.CentimetersToPoints(0.5)  .LeftMargin = Application.CentimetersToPoints(1.5)  .RightMargin = Application.CentimetersToP...

C# WinForm获得主窗体——如何判断哪个是主窗体

一. 关于定义 主窗体的定义一般有两种。第一种就是一般上,普遍意义认为是程序中第一个被创建出来的窗体,但是由于一些程序在显示主窗体之前会有一个登录或者引导窗体,在使用完了之后直接隐藏而不是关闭。这个时候,主窗体并不会是第一个窗体。所以,第二种说法就是说,包含了软件整体功能的展示性界面所在的窗体,我们称之为主窗体。 而在本文中,所有叙述中所指的主窗体都是指的...