Silverlight中用户直接退出浏览器时如何判断用户离线

最近在修改项目中遇到了当用户直接关闭浏览器时无法判断用户离线的难题,在网上找了一天的相关资料,网上提供的方法可总结为两种:

  • 心跳包,每间隔一段时间就传递一个当前时间,然后拿最后一个传过来的值跟当前的时间相比,如果超过了设定的值就判定该用户为离线;

  • 在App.xaml.cs中的Exit事件中调用JS的方法,在JS方法中再去调用WCF中的方法;

第二种不明白具体该如何实现,清楚的可以留言相告一下啊!感激!!!!!

本人使用了第一种实现了,下面来具体说说:

  1. 首先在用户的类里添加了一个UserLastTime字段用来表示用户最后的活动时间并赋初值为当前时间;

  2. 然后在服务端添加一个用于记录已经登录了的用户的列表List<UserData>;

  3. 带判断用户登录成功的地方把当前登录的用户添加到List<UserData>中;

  4. 在主页面中使用DispatcherTimer 制作一个定时器来定时更新List<UserData>中当前用户的UserLastTime字段;

  5. 在需要判断用户是否已经离线的页面同样制作一个定时器来定时比较List<UserData>中当前用户的UserLastTime字段的值与当前系统时间的值,如果两值的差值超过一定的时间即可调用用法把当前用户从List<UserData>中移除。

下面来看一下具体代码:

首先是添加用户到List<UserData>中并得到整个列表:

OnlineUserList.Add(CurrentUser);//用户登录成功后添加
public List<UserData> GetOnlineUsers()//写一个方法用于返回已经登录了的所有用户
      {
         return OnlineUserList;
      }

其次是在页面中定时更新UserLastTime字段的值:

DispatcherTimer Timer = new DispatcherTimer();
Timer.Interval = new TimeSpan(5000);
Timer.Tick += new EventHandler(Timer_Tick);
Timer.Start();
void Timer_Tick(object sender, EventArgs e)
      {
            IProxy mproxy = Factory.Service;
            mproxy.SetUserLastTime(CurrentUser, result =>
            {

            });      
      } 
public string SetUserLastTime(UserData ud)
      {
         if (ud != null)
         {
            for (int i = 0; i < OnlineUserList.Count; i++)
            {
               if (OnlineUserList[i].Id == ud.Id)
               {
                  OnlineUserList[i].UserLastTime=DateTime.Now;
               }
            }
         }
         return "";
      }

最后是如果UserLastTime字段的值跟当前系统时间相差二十秒的话就将当前用户从List<UserData>中移除:

void Current_Exit(object sender, EventArgs e)
      {         <pre name="code" class="csharp">        IProxy mproxy = Factory.Service;
mproxy.OfflineUser(CurrentUser, result => { });
      }
public string OfflineUser(UserData ud) { if (ud != null) { for (int i = 0; i < OnlineUserList.Count; i++) { if (OnlineUserList[i].Id== ud.Id) { OnlineUserList.Remove(OnlineUserList[i]); } } } return ""; }
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = new TimeSpan(3000);
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
void timer_Tick(object sender, EventArgs e)
      {
       foreach (UserData ud in OnlineUsers)
       {
         DateTime cn = new DateTime();
         cn = DateTime.Now;
         if (ud.UserLastTime.AddSeconds(20) < cn)
            {
              UserData ud1 = new UserData();
              ud1.Id = ud.Id;
              ud1.Name = ou.Name;
              IProxy _proxy = Factory.Service;
              _proxy.OfflineUser(ud1, result => { });
             }
         }
<pre name="code" class="csharp"><pre name="code" class="csharp">       }

 
 
 
 

 
 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值