Pregunta

Tengo una aplicación web que almacena un objeto de configuración en ApplicationState. Este objeto contiene la cadena de conexión a la base de datos, entre otras cosas.

A veces me pongo un hilo asíncrono que hacer algunas tareas en ejecución más largo, como el envío de correos electrónicos y actualizar la base de datos.

Sin embargo ya que este hilo no tienen un HttpContext no puedo conseguir en el objeto de configuración.

Sé que este diseño que todo depende de HttpContext es malo, pero eso es demasiado tarde para cambiar ahora. En cuanto a reflector veo que la clase HttpContext sólo utiliza una clase interna estática para obtener el ApplicationState. ¿Hay alguna otra manera de llegar a ella?

Todas las clases internas en .NET son realmente molestos.

¿Fue útil?

Solución

Sólo tiene que pasar lo que quiera con su hilo cuando se inicia. Utilizar un ParameterizedThreadStart delegado para iniciarlo en lugar de sólo un ThreadStart delegado. Usted podría pasar HttpContext.Current, o bien agrupar juntos la información que desea que su hilo tenga, y pasarlo.

Otros consejos

Si realmente Estado necesitan tener acceso a la aplicación (o similar) de los manipuladores asincrónicos debe modificar su HttpApplication subclase (por ejemplo Global.asax) para almacenar la instancia de solicitud Estado (this.Application) a una propiedad estática durante Application_Start:

public static HttpApplicationStateWrapper State { get; private set; }

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

Sería más apropiado utilizar un marco DI para registrar este ejemplo, pero si tiene uno disponible que probablemente podría evitar el uso de estado de la aplicación por completo para el almacenamiento de configuración. Además, no existe un marco de configuración de .NET que se dirige directamente a esta necesidad y proporciona la capacidad de leer la configuración desde cualquier lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top