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();
}