Una webapp ASP.NET 3.5 deve iniziare diverse attività che richiedono ore per essere completate. Per ovvi motivi, le pagine che iniziano queste attività non possono aspettare che finiscano, né qualcuno vorrà aspettare tanto a lungo per ottenere una risposta, quindi le attività devono essere asincrone.Attività a lunga esecuzione di ASP.NET. Si sta interrompendo l'eccezione del thread
Esiste una classe di supporto per gestire tutte queste attività a esecuzione prolungata. Il metodo principale che gli orari ed esegue questi compiti è attualmente la seguente:
public static bool ScheduleTask(TaskDescriptor task, Action action)
{
bool notAlreadyRunning = TasksAsync.TryAdd(task);
if (notAlreadyRunning)
{
Thread worker = null;
worker = new Thread(() =>
{
try { action(); }
catch(Exception e)
{
Log.LogException(e, "Worker");
}
TasksAsync.RemoveTask(task);
workers.Remove(worker);
});
workers.Add(worker);
worker.Start();
}
return notAlreadyRunning;
}
Su implementazioni precedenti abbiamo utilizzato l'approccio ThreadPool.QueueUserWorkItem
ma il risultato è sempre stato lo stesso: dopo ca.. 20-30 minuti di interruzione di un thread è stata generata un'eccezione.
Qualcuno sa perché sta succedendo? o come può essere prevenuto?
Ulteriori informazioni:
- IIS configurazione standard.
- compiti potrebbero essere qualsiasi cosa, querys ad un database e/o operazioni di IO ecc
UPDATE: Le decisioni
Grazie a tutti per le vostre risposte. Ora non so quale domanda segnare come risposta. Tutti sono validi e sono possibili soluzioni a questo problema. Aspetterò oggi e segnerò come risposta la risposta con i voti più alti, in caso di parità sceglierò la prima risposta mostrata, in genere sono ordinati per la maggior rilevanza.
Per chi vuole conoscere la soluzione che scelgo, sempre a causa delle limitazioni di tempo, è stato necessario modificare la configurazione di riciclo di IIS, ma quella che considero la soluzione ideale, basata sulla mia ricerca e naturalmente sulle risposte di seguito, è necessario creare un "Servizio di lavoro" e utilizzare una soluzione di comunicazione tra l'App ASP.NET e il nuovo "Servizio di lavoro" per coordinare il lavoro di lunga durata da svolgere.
I tuoi AppPool/lavoratori IIS vengono riciclati? –
La configurazione di IIS è la configurazione standard per IIS 7. Quindi sì, credo. – Unlimited071
È passato un po 'di tempo dall'ultima volta che ho lavorato in profondità in ASP.NET, ma se la memoria viene utilizzata, quando i processi di lavoro vengono riciclati, possono interrompere i thread. Prova a disabilitare il riciclaggio e vedi se questa è la fonte degli aborti di thread. (non sono sicuro di una soluzione alternativa se questo è il caso però, come ho detto, non ho toccato _questo_ problema particolare) –