在線人數統計

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


public OnLine()
{
///多少分鐘不活動的用戶從在線列表中刪除
OFFLINEDIFF = 5;
///多少秒執行一次刪除不活動用戶
REMOVEDIFF = 30;string

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

public void CheckOnline(string UserId,string UserName)
{
//從Application獲取數據表、獲取UserId
DataTable dtOnline;
dtOnline = (DataTable)System.Web.HttpContext.Current.Application["DataTalbeOnline"];io

//數據表中是否有個人記錄
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;ast

dtOnline.Rows.Add(drNew);
}class

//若是沒有人正在執行刪除且離上次刪除的時間間隔超過設定值
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();
}foreach

//把被我揉膩完了的數據表放回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";
}
}im

相關文章
相關標籤/搜索