2010-04-05 3 views
0

Je vois ce code dans un projet et je me demande s'il est sûr de le faire:Contrôleurs et fils

(ASP.NET MVC 2,0)

class MyController 
{ 
    void ActionResult SomeAction() 
    { 
    System.Threading.Thread newThread = new System.Threading.Thread(AsyncFunc); 
    newThread.Start(); 
    } 

    void AsyncFunc() 
    { 
    string someString = HttpContext.Request.UrlReferrer.Authority + Url.Action("Index", new { controller = "AnotherAction" });  
    } 
} 

est le contrôleur réutilisé, peut-être changer le contenu de HttpContext.Request et Url, ou est-ce bien (sauf pour ne pas utiliser le pool de threads).

Merci pour les informations!

Répondre

0

Même si cela est valide et fonctionne bien maintenant, il semble juste risqué. L'API et/ou l'implémentation sous-jacente peuvent toujours changer dans une future version, ce qui peut provoquer la rupture de ce code.

Une meilleure pratique est de transmettre toutes les données requises pour le nouveau fil dans SomeAction quand il est donné naissance. Par exemple, en utilisant ParameterizedThreadStart comme démontré dans Passing Parameters to Threads.

+0

Ceci est correct. Le type de contrôleur (et HttpContext lui-même) ne sont pas thread-safe. Cela pourrait créer une exception, même si tout ce que vous faites est de lire des données. Et les exceptions non gérées sur les threads ThreadPool peuvent faire tomber le processus de travail entier, tuant toutes les autres demandes que votre application est en train de servir à ce moment. – Levi

+0

Mais vous ne dites pas la même chose. Justin pense que ça devrait être OK (mais ce n'est pas une bonne idée) pendant que vous pensez que ça risque de se produire. – Rabbit

+0

Non, tout ce que je disais était * * même si elle fonctionne bien maintenant ... donc je pense qu'il pourrait jeter aussi bien :) –