2009-05-18 3 views
0

J'ai une situation où l'utilisateur demande de faire un long processus en cours. Je prévois de le démarrer sur un autre thread dans le code-behind et de renvoyer le message à l'utilisateur "processing". Ensuite, toutes les deux ou trois secondes, je vais interroger (via un appel asynchrone) le fil de son statut. Lorsque le thread est terminé, je veux montrer le message de succès.ASP.NET vérifie l'état des threads sur un thread en cours d'exécution?

Question, comment interroger un thread une fois la requête d'origine terminée? Pour autant que je sache, l'objet Page va supprimer un fil distinct. Lorsque la requête est terminée, l'objet Page n'est plus là ... mais qu'en est-il de ce thread? Comment puis-je obtenir le statut de ce thread que j'ai créé?

Répondre

3

Eh bien, vous aurez besoin certains d'identifier la demande. Si vous voulez être capable de l'étendre à plusieurs machines, vous devriez chercher à stocker l'ID de demande et l'état actuel dans une base de données (ou un stockage similaire accessible de n'importe où).

Si vous ne se soucient pas de cette situation et vous n'êtes pas inquiet au sujet du recyclage AppDomain, vous pourriez avoir un dictionnaire singleton d'ID de demande de statut - mais envisager d'en faire vidé automatiquement après une certaine période si la le client s'en va et ne vérifie pas l'état.

(Bien sûr, il ne doit pas être un vrai singleton - il pourrait être une ressource partagée fournie avec injection de dépendance, mais le point est qu'il doit être partagé en quelque sorte de sorte que vous pouvez y accéder à partir du nouveau demande.)

Vous pouvez également utiliser potentiellement un objet sauvegardé en session - encore une fois avec des mises en garde sur les sites Web multiserveurs et le recyclage AppDomain.

+0

Ainsi, je crée une classe singleton qui stocke (demande ID, statut) sur la demande originale. alors le thread va mettre à jour le statut en utilisant cette classe singleton. puis, sur toute demande ultérieure, je peux vérifier le statut via cette classe singleton. Est-ce exact? –

+1

Le singleton stockerait une collection de "demande actuelle, statut" oui. Mais vous feriez peut-être mieux d'aller chercher un objet de session, d'y penser. Tout ce que cela fait est de traiter le conteneur de session dans le cadre comme le singleton - c'est exactement le même principe. Vous serez en mesure de voir ce qui se passe plus clairement en utilisant votre propre conteneur. –

+0

en ce qui concerne le nettoyage, je peux supprimer la paire "demande actuelle, statut" de la session lorsque l'utilisateur demande l'état et lorsque l'état est "terminé". Cependant, je vais toujours avoir besoin d'un moyen de gérer la situation où l'utilisateur ne demande pas de statut (quitte ou ferme la page). Y a-t-il une façon standard de faire cela pour nettoyer? –

0

Je ne suis pas d'accord avec la réponse de Jon. Vous n'avez pas besoin d'un moyen d'identifier la requête, vous avez besoin d'un moyen d'identifier de manière unique le thread que votre requête a créé. Ensuite, votre requête ajax pour interroger le thread peut vérifier si l'exécution du thread est terminée. Je ne vois pas pourquoi la requête d'origine est tout à fait pertinente ...

Questions connexes