2012-10-23 12 views
7

.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?

+0

È possibile aggiungere un servizio sul computer? – Patrick

+0

Posso, ma mi chiedo come fornire un'esecuzione consecutiva per ogni thread di app Web? – YMC

risposta

3

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.

+0

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

+0

NServiceBus ne gestirà molte (installazione e configurazione di MSMQ e DTC) progettato per risolvere il problema. problema che hai menzionato. –

+0

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

4

. 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"

12

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.

+0

Ottima soluzione. Grazie per il framework. – scottheckel

Problemi correlati