Question

Considérez ce code ...

using System.Threading;
//...
Timer someWork = new Timer(
    delegate(object state) {
        //Do some work here...
    },
    null, 0, 60000);

HttpContext.Current.Application["SomeWorkItem"] = someWork;

Cela pourrait-il être dangereux? Mettre en cache une minuterie dans l’application pour effectuer certains travaux en arrière-plan pendant l’exécution de votre site semble sans danger, mais je me demandais si quelqu'un aurait déjà eu une expérience en la matière.

Je suis sûr que rédiger un service en arrière-plan serait certainement beaucoup mieux, mais parfois cela n’est pas toujours une option. Est-ce une alternative?

Était-ce utile?

La solution

Ce serait généralement une mauvaise idée, car System.Threading.Timer utilise les threads du ThreadPool, de la même manière qu'ASP.Net.

Si pour une raison quelconque votre délégué délégué bloque ou arrête, il commencera simplement un nouveau thread après la période de temporisation, ce qui rongera les threads disponibles pour ASP.net.

S'ils commencent tous à bloquer, vous ne pourrez effectivement plus répondre aux demandes Web (probablement une mauvaise chose)

Autres conseils

Le problème, c’est que vous n’êtes pas assuré que le processus est toujours actif. IIS récupérera le processus pratiquement chaque fois que cela vous semblera nécessaire. Vous risquez donc de ne pas l'exécuter.

Si vous avez besoin de ce travail, vous devez le coder en appel Web ou faire exécuter un service en arrière-plan du serveur.

Cela serait dangereux car il peut arriver que le processus de travail soit recyclé ou que l'AppDomain se bloque et que l'élément de travail soit tué et que vous souhaitiez peut-être qu'il récupère ce qu'il faisait, cela risque de ne pas être possible.

Un service Windows peut convenir si vous pouvez intégrer cet élément de travail à un service. Si un contexte HttpContext est requis pour le travail, vous pouvez également demander à un service Windows d’appeler un service Web pour effectuer périodiquement l’appel, qui risque de ne pas fonctionner parfaitement.

Cela a du sens, mais juste pour le plaisir, que se passe-t-il si le travail n’a pas besoin d’être exécuté si le site est fermé? S'il est associé à l'événement Application_Start et qu'il doit uniquement être exécuté pendant que des personnes naviguent sur le site, quels sont les risques à ce moment-là?

Bonne réponse, je suis juste curieux de savoir comment cela fonctionne à l'intérieur.

Je vous recommanderais de configurer une tâche planifiée pour exécuter une page sur votre site. Je pointe généralement la tâche planifiée vers un fichier .vbs avec les éléments suivants:

On Error Resume Next
Dim objRequest
Dim URL

Set objRequest = CreateObject("Microsoft.XMLHTTP")
URL = "http://www.mywebsite.com/cron/pagetorun.ashx"

objRequest.open "POST", URL , false

objRequest.Send

Set objRequest = Nothing

Omar Al Zabir a publié un excellent article sur l’utilisation des rappels d’éléments de cache à cette fin.

http://www.codeproject.com/KB/aspnet/ASPNETService.aspx?fid=229682&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=76&fr=76&select=1334820

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top