2010-06-23 4 views
1

J'ai une page aspx.cs et une page aspx correspondante pour cela. Lorsque cette page est chargée, et sur un événement de bouton, j'ai créé un fil qui s'exécute pendant un certain temps et puis se termine. Je voudrais savoir qui est le parent de ce fil.Fil dans le code derrière

Disons que le fil est en cours d'exécution et je fermer cette page, vous cette sortie de fil? Je l'ai fait mais le fil continuait de tourner.

En fait, je veux faire est le nettoyage de la tâche au moment où la page est fermée par l'utilisateur.

Est-ce que w3wp est le parent de ce sujet? Si non, si je ferme cette page qui deviendra le parent?

Répondre

1

Les threads n'ont pas de parents. En particulier, la «mort» d'un parent ne signifie rien pour eux.

Un problème que vous pouvez rencontrer est que votre méthode de fil peut dépendre de données spécifiques à la page ou à la demande. Tout ce qui dépend de HttpContext sera un problème, car le thread peut toujours être exécuté après la fin de la requête et HttpContext n'est plus valide. Il en va de même pour que le thread dépende de n'importe quoi sur la page, puisque la page est détruite après que la requête soit terminée.

Voir « Wicked Code: Asynchronous Pages in ASP.NET 2.0 » pour apprendre un bon modèle pour les actions asynchrones dans les pages ASP.NET. Voici comment les pages sont classées et pour interagir avec le monde asynchrone.

0

L'exécution de threads au nom des utilisateurs n'est pas recommandée. Je recommande d'examiner les pages asynchrones si possible pour votre site.

Si vous avez réellement besoin d'un thread, vous devez créer une recherche de thread par ID de session (par exemple, Dictionary<string, Thread>). Lorsque vous démarrez le thread, stockez-le dans le dictionnaire (l'ID de session en cours est Session.SessionID). Lorsque la session se termine (Session_OnEnd dans Global.aspx), dites au thread d'arrêter et de le supprimer du dictionnaire. N'oubliez pas de verrouiller votre objet dictionnaire.

0

Depuis votre navigateur et votre serveur Web ne sont aucunement reliés autre que les quelques fois étranges que vous avez réellement faire une demande, ASP.NET ou IIS ne peut pas détecter la fenêtre de votre navigateur est fermé. La seule chose que vous pouvez faire est de détecter la fin de la session. Puisque vous indiquez que vous ne souhaitez que faire le nettoyage et que je ne suis pas sûr que ce soit une bonne idée de faire une longue opération en cours d'exécution dans votre gestionnaire de Session_OnEnd, vous pouvez utiliser la piscine de fil:

protected void Session_OnEnd(object sender, EventArgs e) 
{ 
    ThreadPool.QueueUserWorkItem(CleanUpSession, myStateObject); 
} 

private void CleanUpSession(object state) 
{ 
    // do your clean-up here 
} 
Questions connexes