Domanda

Sto facendo un lavoro asincrono su un thread separato utilizzando:

ThreadPool.QueueUserWorkItem()

e in questo thread separato, devo chiamare HttpContext.Current in modo da poter accedere a:

HttpContext.Current.Cache  
HttpContext.Current.Server  
HttpContext.Current.Request  

Tuttavia, HttpContext.Current è null quando creo questo thread separato.

Domanda

Come faccio a creare un nuovo thread in modo che HttpContext.Current non è nullo?Oppure esiste un altro modo per accedere agli oggetti Cache, Server e Richiesta?

È stato utile?

Soluzione

mi piacerebbe provare di non tenere un riferimento a un oggetto che dipende dalla pila ASP.NET come il HttpContext. Se avete bisogno di fare un certo lavoro in un thread diverso, è perché non si vuole aspettare in ASP.NET uno fino al vostro compito è finito. E forse la richiesta / Contesto / sessione è terminata in tutta thread non è.

Si dovrebbe passare un oggetto con i dati necessari per il vostro thread.

Altri suggerimenti

È possibile accedere alla cache ASP.NET con HttpRuntime.Cache anche quando non hai un HttpContext, ma sfortunatamente non puoi accedere al Server o alla Richiesta.

Se ci pensi, ha senso: non stai servendo nessuna pagina, quindi non hai una richiesta.

1- Aggiungere codice di fondo in <system.serviceModel> nel file web.config:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

2- Aggiungere codice di fondo dopo NameSpace nel file di servizio Web:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

3- Ricostruire progetto web part. Fatto!

riferimento

Per HttpContext.Server servizi che si possono utilizzare la classe HttpServerUtility. Per la cache è possibile utilizzare HttpRuntime.Cache, come si è detto sopra. Per l'oggetto richiesta è possibile passare i dati dalla richiesta al filo al momento della creazione. Cose come Request.QueryString o Request.Form ... o qualsiasi altra cosa.

C'è un'implementazione pool di thread qui che fornisce la propagazione del contesto HTTP del thread chiamante . Non ho ancora usato, ma ho intenzione di.

Se il thread separato sta tentando di accedere a tali oggetti, allora sì che sarà nullo. Questi oggetti vengono ambiti a livello thread. Se si desidera utilizzarli in un nuovo thread si dovrà passarli al metodo / classe in cui ne avete bisogno.

In genere ASP.Net non consente di creare sotto nuove discussioni ... Ecco un pubblicare sull'argomento.

Ecco una bella scrittura su filettatura in ASP.NET da MSDN .

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