2017-01-04 3 views
1

Ich habe einen Timer gestartet, wenn meine Hub-Verbindung in PushNotificationData Methode von Client-Anforderungen eingerichtet ist.So stoppen Sie den Timer bei OnDisconnected Ereignis in SignalR

Wie Timer-Intervall, holt es die Datensätze aus der Datenbank und Push an die Clients. , aber wenn die Verbindung getrennt wurde, muss dieser Timer gestoppt werden, anstatt kontinuierlich zu ziehen.

So habe ich OnDisconnected Ereignis verwendet, um den Timer zu stoppen. aber leider Timer nicht gestoppt zu werden

hier ist mein Code:

public class NotifyHub : Hub 
{ 
    private string ConnectionId; 
    private int UserId; 
    private int UserTypeId; 

    Timer timer = new Timer(); 

    public override Task OnConnected() 
    { 
     ConnectionId = Context.ConnectionId; 
     return base.OnConnected(); 
    } 
    public override Task OnDisconnected(bool stopCalled) 
    { 
     timer.Stop(); 
     timer.Enabled = false; 
     //logic code removed for brevity 
     return base.OnDisconnected(stopCalled); 
    } 
    public void PushNotificationData(Int32 userId, Int16 userTypeId) 
    { 

     UserId = userId; 
     UserTypeId = userTypeId; 
     ConnectionId = Context.ConnectionId; 

     timer.Elapsed += Timer_Elapsed1; 
     timer.Interval = 6000; 
     timer.Enabled = true; 
     timer.Start(); 

    } 

    private void Timer_Elapsed1(object sender, ElapsedEventArgs e) 
    { 
     var notificationParams = new PushNotificationRequest 
     { 
      FilterProperty = new Common.Filters.FilterProperty { Offset = 0, RecordLimit = 0, OrderBy = "datechecked desc" }, 
      Filters = new List<Common.Filters.FilterObject> { new Common.Filters.FilterObject { LogicOperator = 0, ConditionOperator = 0, Function = 0, FieldName = "", FieldValue = "", FieldType = 0 } } 
     }; 
     using (INotificationManager iNotifity = new NotificationManager()) 
     { 
      var taskTimer = Task.Run(async() => 
      {       
       var NotificationResult = iNotifity.GetPushNotificationData(notificationParams, UserId, UserTypeId); 
       //Sending the response data to all the clients based on ConnectionId through the client method NotificationToClient() 
       Clients.Client(ConnectionId).NotificationToClient(NotificationResult); 
       //Delaying by 6 seconds. 
       await Task.Delay(1000); 
       //} 
       }); 
     } 
    } 
} 

Wenn ich es debuggen, es zeigt Timer enabled=true auch nach OnDisconnected Brände.

der Moment OnDisconneted ausgeführt wird, kann ich sehen, dass Timer aktualisiert enabled=false. nachdem es aus dem OnDisconnectedtimer.enabled herausgekommen ist, bekam true wieder.

+2

Sie müssen diesen Entwurf umgestalten. Hubs sind nicht dazu gedacht, den Status beizubehalten. –

Antwort

4

Lesen Sie über die Lebensdauer des Hub-Objekts here. Der wichtige Teil ist das

Da Instanzen der Hub-Klasse transient sind, können Sie sie nicht verwenden, um den Status von einem Methodenaufruf zum nächsten beizubehalten. Jedes Mal, wenn der Server einen Methodenaufruf von einem Client erhält, verarbeitet eine neue Instanz Ihrer Hub-Klasse die Nachricht. Verwenden Sie zum Beibehalten des Status über mehrere Verbindungen und Methodenaufrufe eine andere Methode, z. B. eine Datenbank oder eine statische Variable in der Hub-Klasse oder eine andere Klasse, die nicht von Hub abgeleitet ist. Wenn Sie Daten im Speicher beibehalten und eine Methode wie eine statische Variable in der Hub-Klasse verwenden, gehen die Daten verloren, wenn die App-Domäne wiederverwendet wird.

Sie erstellen im Wesentlichen einen neuen Timer jedes Mal, wenn ein neuer Hub erstellt wird. Sie landen also mit mehreren Timern, die alle die Methode Timer_Elapsed1 aufrufen. Sie könnten versuchen, Timer statisch zu machen und die Verbindungsanzahl zu verfolgen. Auf diese Weise können Sie den Timer stoppen, wenn alle Clients getrennt sind. Beachten Sie jedoch, dass selbst statische Variablen verloren gehen können, wenn die App-Domäne wiederverwendet wird (wie in den obigen Dokumenten ausgeführt).

+0

kann keinen Timer pro Verbindung erstellen? So können wir den Timer stoppen, sobald der Benutzer die Verbindung getrennt hat. ein –

Verwandte Themen