Domanda

Ho una webapp che memorizza un oggetto config nella ApplicationState. Questo oggetto contiene la stringa di connessione al database tra le altre cose.

A volte comincio un filo async per fare un paio di più attività in esecuzione, come l'invio di e-mail e l'aggiornamento del database.

Tuttavia, poiché questa discussione non hanno un HttpContext non riesco a ottenere l'oggetto di configurazione.

So che questo disegno che tutto dipende HttpContext è male, ma questo è troppo tardi per cambiare la società. Guardando riflettore vedo che la classe HttpContext solo utilizza una classe interna statica per ottenere l'ApplicationState. C'è un altro modo per ottenere a questo?

Tutte le classi interne in .net sono davvero fastidioso.

È stato utile?

Soluzione

Basta passare quello che vuoi al tuo thread quando lo si avvia. Utilizzare un ParameterizedThreadStart delegato per avviarlo invece di un ThreadStart delegato. Si potrebbe o passare HttpContext.Current, oppure raggruppare insieme le informazioni che desidera che il thread per avere, e passarlo.

Altri suggerimenti

Se davvero hanno bisogno di accesso a Applicazione Stato (o simili) da gestori asincroni si dovrebbe modificare la HttpApplication sottoclasse (ad es Global.asax) per memorizzare l'istanza di applicazione di Stato (this.Application) a una proprietà statica durante Application_Start:

public static HttpApplicationStateWrapper State { get; private set; }

protected void Application_Start()
{
    State = new HttpApplicationStateWrapper(this.Application);
}

Sarebbe più opportuno utilizzare un quadro DI registrare questo caso, ma se ne avete uno a disposizione si potrebbe forse evitare l'uso di Application Stato del tutto per la memorizzazione di configurazione. Inoltre, v'è un framework di configurazione in .NET che si rivolge direttamente a questa esigenza e offre la possibilità di leggere la configurazione da qualsiasi luogo.

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