2017-04-12 7 views
0

J'ai une application qui permet à l'utilisateur de télécharger un fichier Excel contenant des milliers de données, puis dans le code de la méthode d'action du contrôleur chaque ligne et importer dans le système.SignalR Comment arrêter l'exécution du code d'action du contrôleur lorsque Disconnected() est appelé

J'utilise le signalR parce que je veux afficher le pourcentage du processus en temps réel à l'utilisateur.

Cependant, je veux également la possibilité d'arrêter l'exécution du code si l'utilisateur appuie sur le bouton STOP.

Javascript: Je déclare du client

$.connection.hub.stop() // this javascript is called from client 

C#: cette méthode est appelée dans le code du serveur

// then this action will be called 
public override Task OnDisconnected(bool stopCalled) 
{ 
    // what should i put here?? 
    return base.OnDisconnected(stopCalled); 
} 

Cela arrêtera la connexion mais il ne s'arrête pas le code d'action du contrôleur de continuer à exécuter pour les prochaines 5-10 minutes ou plus et c'est un gaspillage de ressources.

Le code ci-dessous ne fonctionne pas car lorsque Hub est déconnecté Response.IsClientConnected est toujours vrai et la boucle continue de s'exécuter.

// controller action method code: 
for (int i = 0; i < rows.Count; i++) 
{ 
    if (!Response.IsClientConnected) // this is true even when disconnected, however this code will work if the user completely exits the browser tab. 
    { 
     Response.End(); 
    } 

    // process this row 
} 
+0

vous ne devriez pas arrêter la connexion (en appelant stop()) sur le moyeu, le rat elle vous devriez créer une méthode qui peut être appelée du côté client qui arrête tout ce que le serveur fait .. (CLIENT-> SERVEUR) – DOMZE

+0

@DOMZE merci pour votre commentaire mais aucune justification quant à pourquoi je ne devrais pas utiliser $ .connection .hub.stop()? il semble faire ce que je voulais, c'est arrêter la connexion. Maintenant, tout ce dont j'ai besoin est un moyen pour le serveur de vérifier que la connexion au client est toujours en vie ou pas, sinon elle stopperait l'exécution du code. – andyh0316

+0

En supposant que vous commenciez à utiliser SignalR pour d'autres choses, cela arrêtera toutes les connexions. Donc, en supposant que vous avez un système de notification à l'écoute, ce sera également arrêté – DOMZE

Répondre

0

Vous pouvez créer des méthodes publiques sur votre classe de concentrateur, puis accéder à ces méthodes en les appelant à partir de scripts dans une page Web.

En supposant que vous voulez faire, vous pouvez créer une méthode dans votre classe de Hub appelé StopProcess()

public void StopProcess() 
{ 
    Clients.Caller.onStopProcess(); 
} 

clients dans le navigateur peut alors appeler cette méthode pour arrêter le processus:

$.connection.hub.stopProcess(); 

Ensuite, dans votre javascript vous pouvez avoir:

$.connection.hub.onStopProcess = function() { 
    //what you want your client to do 
};