Domanda

Ho un'applicazione ASP.Net che spara alcuni lavoratori di sfondo con ThreadPool.QueueUserWorkItem (). La maggior parte del tempo ci sarà a zero thread in background in esecuzione, tuttavia è possibile che ci potrebbero essere fino a occationally 5-6 esecuzione alla volta. Inoltre, la maggior parte sarà completa entro un paio di secondi, ma è possibile che possano funzionare per fino a 10 minuti.

In considerazione tutti i diversi scenari che potrebbero causare un arresto di un'applicazione ASP.Net, mi piacerebbe avere questi processi in background uscita con grazia, se possibile, quando le esigenze applicative per l'arresto e sono nel bel mezzo di lavorazione.

Non anticipare avere troppo di un problema di creare un modo per segnalare i processi per fermare il loro lavoro in anticipo e ripulire entro pochi secondi di ottenere la chiamata che l'applicazione viene chiusa. Anche se qualcuno ha una consulenza specifica su questo mi piacerebbe sicuramente apprezzare.

Le mie due domande principali sono:

1) Quando sarebbe il momento opportuno per dire ai lavoratori in background per avvolgere le cose. Durante Application_End? Dispose ()? O forse una terza opzione non sono a conoscenza.

2) Se aspetto durante l'evento di cui sopra per i processi di finitura prima di tornare, c'è un punto in cui non avere ritorno Application_End immediatamente potrebbe causare problemi più gravi per l'applicazione di quanto non arrestare i processi in background bene.

void Application_End(object sender, EventArgs e) 
{
    //if this for whatever reason takes a non-trivial time to execute, what problems could I encounter? 
    SignalBackgroundJobsAndWaitForThemToShutDown();
}

Grazie!

È stato utile?

Soluzione

Il momento opportuno è sul Application_End

Ora, dopo si segnale tuoi processi in background è necessario aspettare che siano loro a quel punto alla fine, e poi lasciare che continuare, come sembra che si fa.

hanno in miniera, che è bene mettere un time out sul l'attesa, non aspettare per sempre, altrimenti la vostra piscina può avere problemi, o l'arresto, allora avete bisogno di controllare l'impostazione piscina al massimo di attesa per spegnere la piscina , ci impostare un valore maggiore di vostra attesa, o semplicemente disabilitato.

hanno anche in miniera che se si dispone di giardino con piscina, (più di 1 piscine di lavoro), allora l'Application_End viene chiamato una volta per ogni piscina.

Io uso la stessa tecnica sui miei siti, allo stesso modo io segnalo le mie discussioni per fermare allo stesso modo, ho appena accedo anche il fine ultimo, e verificare, al momento fine ultimo, e anche io forzo la mia routine di fermarsi e non lasciarli correre per molte volte. L'Application_End viene chiamato sul riciclo della piscina, o quando si apre il file app_offline.htm, o quando si va a chiudere il servizio web. Personalmente ho disabilitare i ricicli, non ho bisogno di loro e ho aprire solo l'app_offline.htm quando faccio gli aggiornamenti. In quel momento io aspetto il mio thread del pool di fermare il loro lavoro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top