.net 4.5, asp.net mvc: qual è il modo migliore per eseguire un processo di lunga durata (1-2 minuti) dall'applicazione ASP.NET, assegnando a tale scopo l'esecuzione in un ambiente a thread singolo, ovvero il processo è avviato per un solo utente alla volta, le esecuzioni per tutti gli altri utenti devono attendere fino al termine dell'esecuzione corrente? Lo scenario è il seguente: pulsante clic utente che esegue una sorta di calcoli di lunga durata, risposta HTTP restituita all'utente immediatamente, quindi l'utente deve richiedere lo stato dei calcoli con richiesta separata manualmente. L'aborto della sessione http di Asp.net non dovrebbe portare alla conclusione del processo, dovrebbe andare avanti. Il processo potrebbe essere eseguito sullo stesso server o su un server separato.Come eseguire il processo di lunga durata in modo asincrono sotto asp.net?
risposta
Suggerirei di utilizzare un prodotto come NServiceBus per scaricare l'elaborazione ed eseguirlo in modalità single threaded. Il vantaggio è che tutte le richieste verranno elaborate in ordine e l'elaborazione può essere scaricata dal server Web in quanto non si desidera realmente che i processi a esecuzione prolungata si verifichino su un server Web.
In realtà stiamo considerando questa opzione. Ci sono dei vantaggi come lei, ma ci sono anche aspetti negativi come l'infrastruttura necessaria: MSMQ, creazione di code di messaggi, configurazione separata – YMC
NServiceBus ne gestirà molte (installazione e configurazione di MSMQ e DTC) progettato per risolvere il problema. problema che hai menzionato. –
Mi piace NSBus, probabilmente è la soluzione migliore per noi, ma quello che intendevo è che ci saranno alcuni costi amministrativi aggiuntivi per questa soluzione come questa: 1) MSMQ, RavenDb, e forse qualcos'altro deve essere installato, mi ricordo che dovevo scaricarli e installarli separatamente, non erano parte del pacchetto NSBus, 2) Qualcuno deve controllare periodicamente la coda dei messaggi falliti, in aggiunta al nostro normale file di registro (due punti di tracciamento delle app invece di uno) 3) Il processo separato significa supporre avere una propria configurazione (due file di configurazione da gestire invece di uno) – YMC
Vorrei dare un'occhiata a questo, scritto da Phil Haack, spiega i problemi che si potrebbero avere attività in background all'interno di un'applicazione web. http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx
Questo è stato un post fantastico al giorno, ma è obsoleto (almeno per WAWS) ora. Vedere la risposta di Azure WebJobs – RickAndMSFT
. Net 4.5.2 aggiunge QueueBackgroundWorkItem che è possibile utilizzare per pianificare un'attività. Se non si controlla il server (quando viene riavviato), il ritardo predefinito di 90 secondi di spegnimento di appPool non funzionerà (a meno che non sia possibile rilevare che l'attività non è stata completata ed eseguirla su un altro server). Per ulteriori dettagli vedi "QueueBackgroundWorkItem to reliably schedule and run background processes in ASP.NET"
Ti mostrerò come eseguire questa attività con http://hangfire.io - incredibilmente facile modo di eseguire attività ignifughe, ritardate e ricorrenti all'interno di applicazioni ASP.NET. Nessun servizio di Windows richiesto.
Innanzitutto, installare il pacchetto tramite NuGet. In caso di problemi, consultare la guida Quick Start nella documentazione ufficiale.
PM> Install-Package Hangfire
Aprire la classe OWIN Avvio e aggiungere le seguenti righe:
public void Configure(IAppBuilder app)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("connection_string");
app.UseHangfireDashboard();
app.UseHangfireServer();
}
quindi scrivere il metodo che farà il lavoro di lunga durata (ho applicato l'attributo di eseguire solo un metodo alla volta) :
[DisableConcurrentExecution]
public void LongRunning()
{
// Some processing stuff
}
e quindi chiamare un metodo in background come il fuoco e dimentica di rispondere utente immediatamente:
public ActionResult Perform()
{
BackgroundJob.Enqueue(() => LongRunning());
return View();
}
Se si desidera informare un utente sul completamento del lavoro, considerare l'utilizzo di SignalR e aggiungere il metodo LongRunning
in modo corrispondente.
Ottima soluzione. Grazie per il framework. – scottheckel
- 1. Come eseguire attività di lunga durata?
- 2. asp.net ThreadPool - funzionamento di lunga durata
- 3. È necessario un processo in esecuzione ASP.NET MVC di lunga durata con feedback degli utenti
- 4. Eseguire l'inizializzazione di lunga durata nel servizio Windows
- 5. Servizio Android di lunga durata
- 6. Arresta la GUI pygtk dal blocco durante il processo di lunga durata
- 7. ASP.Net Web Service: il codice in esecuzione in modo asincrono
- 8. Come acquisire l'output del processo in modo asincrono in PowerShell?
- 9. Chiamate di processo asincrono
- 10. Come posso eseguire le query di NHibenate in modo asincrono?
- 11. Errore di orchestrazione nel test dell'unità di lunga durata
- 12. Arresta o termina la query di lunga durata in JDBC
- 13. Django Celery: esegue solo un'istanza di un processo di lunga durata
- 14. Come eseguire il processo Quartz.NET in modo sincrono?
- 15. Test automatizzati .NET per processi di lunga durata
- 16. Trasmissione di testo in streaming per un'azione di lunga durata?
- 17. Qual è il modo migliore per creare una coda per lavori di lunga durata in un'app Grails?
- 18. Utilizzo di WebClient all'interno di ASP.NET MVC in modo asincrono?
- 19. .NET: meccanismo per la sincronizzazione di attività di lunga durata
- 20. Qual è il modo corretto di eseguire codice Python in modo asincrono?
- 21. Come mantenere i rami git di lunga durata
- 22. profiler gevent per il codice di lunga durata
- 23. C# Leggi lo stdout del processo figlio in modo asincrono
- 24. Il modo migliore per eseguire il metodo in modo asincrono in Android (compatto e corretto)
- 25. Async/attendono per i metodi di lunga durata API con il progresso/cancellazione
- 26. Come terminare un isolamento di lunga durata n. 2
- 27. Notifica di avanzamento in WCF per processi di lunga durata - Come?
- 28. Wicket: come gestire le attività di lunga durata
- 29. Il modo migliore per scaricare periodicamente il pool di autorelease su un thread in background di lunga durata?
- 30. Come posso analizzare gli argomenti di lunga durata nella shell?
È possibile aggiungere un servizio sul computer? – Patrick
Posso, ma mi chiedo come fornire un'esecuzione consecutiva per ogni thread di app Web? – YMC