SignalR timer event unsubscribe if user disconnected or browser closed

26 views Asked by At

I am working on a project which is using SingalR to refresh my grid. I am trying to unsubscribe timer event for particular user who got disconnected or closed the browser. Suppose two user connected with grid and the same time two timer event subscribed and running at interval but if any one of user got disconnected from browser then only one time should execute and second time method should be unsubscribe.

public override Task OnConnected()
{
 UserHandler.ConnectedIds.Add(Context.ConnectionId);
 return base.OnConnected();
}

public override Task OnDisconnected(bool stopCalled)
{
   UserHandler.ConnectedIds.Remove(Context.ConnectionId);
   return base.OnDisconnected(stopCalled);
}

My timer event

protected void StartServiceTimer(Action timerElapsedHandler, double? timerElapsedInterval = null)
{
 var dict = new Dictionary<double, Action>
 {
     {timerElapsedInterval ?? timerIntervalDefault, timerElapsedHandler}
 };
 StartServiceTimers(dict);
}

 protected virtual void StartServiceTimers(Dictionary<Double, Action> timersElapsedHandlers)
{
 foreach (var handler in timersElapsedHandlers)
 {
                   if (this.Timers.ContainsKey(handler.Value.Method.Name))
         continue;

     var timer = new Timer { Interval = handler.Key };
     this.Timers.Add(handler.Value.Method.Name, timer);

     ElapsedEventHandler elapsedHandler = (sender, args) => handler.Value();
     timer.Elapsed += elapsedHandler;
     // immediately call elapsed so user doesn't have to wait
     elapsedHandler.BeginInvoke(this, null, this.Timer_ElapsedCallback, elapsedHandler);
 }

 this.StartServiceTimers();

}

to stop timer event

 protected void StopServiceTimers()
 {
  foreach (var timer in Timers)
      timer.Value.Stop();
 }

 protected void ClearServiceTimers()
{
    StopServiceTimers();
    this.Timers.Clear();
 }
0

There are 0 answers