Exécuter une tâche en arrière-plan, mais le retour de la réponse au client dans ASP MVC de l'application web
Je suis en train de mettre en œuvre une fonctionnalité où il y a une procédure stockée sur le Serveur SQL server qui doit être appelée à partir d'ASP MVC de l'application et traitées sur le fond (ca peut prendre longtemps car il demande une autre procédure stockée à distance pour traiter un fichier excel stockés sur un serveur). Mais la réponse de la dernière requête HTTP doivent être retournées au client pour que l'INTERFACE utilisateur ne sera pas suspendu en attente de traitement.
J'ai essayé beaucoup de différentes façons, mais l'INTERFACE est encore de ne pas répondre tout de suite.
J'ai essayé BackgroundWorker
mais il ne permet pas que le thread principal de réponse au client jusqu'à ce que sa fait de traitement,
aussi j'ai essayé:
Thread.QueueUserWorkItem(delegate { //method which performs stored procedure calls//
});
Toujours pas de retour de réponse et HttpContext.Current
pas disponible dans le thread d'arrière-plan.
Peut-être il ya une façon de commencer le traitement en arrière-plan, le mettre en pause pour laisser thread principal pour retourner la réponse au navigateur, puis de reprendre la thread d'arrière-plan pour faire tout le traitement avec des appels de procédures stockées?
Suis-je raté quelque chose?
Quelqu'un pourrait-il me donner un idée de comment je peux résoudre ce problème? Serait très apprécié.
OriginalL'auteur Paul | 2014-07-18
Vous devez vous connecter pour publier un commentaire.
Ce que j'ai et il fonctionne très bien dans mon cas. Je ne suis pas sûr de l'efficacité, mais il fonctionne parfaitement. Donc, le code qui permet d'appeler une procédure stockée je l'ai mis sur un thread séparé, de sorte que le thread principal est terminé alors que le traitement hors de fond des appels qui se passe sur un thread séparé et se termine avec succès après une certaine période de temps. Dans le même temps, l'INTERFACE utilisateur est disponible de sorte que l'utilisateur peut faire une autre demande qui seront également traitées de la même manière. J'ai testé trois demandes. L'un après l'autre, se chevauchent, ce qui signifie que pendant la première demande a été traitée sur le fond, j'ai déposé un autre et encore un autre. L'INTERFACE utilisateur a été de répondre immédiatement et tout le travail qui a été fait.
OriginalL'auteur Paul
Je cite Stephan Clearys article:
Fondamentalement, cela ne veut pas respecter le protocole HTTP, où chaque requête n'a qu'une seule réponse.
Ceci peut être réalisé à l'aide de multiples appels à la ASP.NET service, où une requête retourne un IDENTIFIANT unique immédiatement, le client peut interroger plusieurs fois pour le progrès. Vous pouvez rechercher des SignalR pour obtenir de l'aide avec une telle mise en œuvre:
OriginalL'auteur Yuval Itzchakov
Il est part1 et part2 article par Dino Esposito décrit une façon d'atteindre votre bureau de vote à l'aide d'un client à côté de la minuterie et les actions du contrôleur. Il suffisait de sérialiser l'accès à un progrès travailleur contrôleur méthode qui retourne le statut de la tâche et de l'achèvement de données. Cependant, il peut être un peu bavard si vous allez seulement d'effectuer un ou deux long processus en cours d'exécution.
OriginalL'auteur Ross Bush
Si la réponse au client ne dépend pas de la suite du processus d'arrière-plan (c'est à dire lancer le processus en arrière-plan et n'ont pas l'INTERFACE utilisateur en attente pour cela), alors vous pouvez utiliser Revalee (un outil open-source) pour effectuer la tâche en arrière-plan.
L'IU de la demande de cette route...
Travail de fond sera exécuté dans ce contrôleur...
Revalee Site Du Projet
OriginalL'auteur Brian R. Mullin