2008-10-06 13 views
7

Tengo un requisito en mi aplicación que creo que se puede cumplir mediante el uso de almacenamiento local de subprocesos, pero me pregunto si es una de esas cosas que es mejor evitar.¿Cuáles son las mejores prácticas para usar el almacenamiento local de subprocesos en .NET?

He leído algunos artículos sobre el tema:

http://www.dotnetcoders.com/web/Articles/ShowArticle.aspx?article=58

http://msdn.microsoft.com/en-us/library/system.threadstaticattribute(vs.80).aspx

sé cómo Para usarlo, me pregunto si yo debería usarlo.

¿Algún consejo, debe tener en cuenta?

[Editar]

Aquí está el caso de uso:

I embudo de todos los accesos a datos a través de algunos métodos que hacen un montón de registro sobre cada consulta. Una cosa que registro es un volcado completo del texto de comando con los comandos completados para poder simplemente copiar y pegar desde mis registros de rastreo directamente en Sql Management Studio.

Camino en global.asax en mis aplicaciones web Envío un correo electrónico a los administradores con tanta información como pueda cuando recibo una excepción no controlada. Quiero poner ese texto de volcado de comando sql en este correo electrónico cuando obtengo una SqlException, lo que me ahorrará tiempo de buscar registros de seguimiento cuando una página explota debido a una consulta.

No quiero cambiar las firmas de método de mis clases de acceso a datos solo para poder pasar alguna referencia a lo largo de la pila, solo para sacarla cuando recibo una excepción. Estaba pensando que tal vez TLS sería un buen lugar para poner algo como "lastsqlcommand", pero eso no parece una solución viable.

+0

Siempre he evitado el almacenamiento local de subprocesos y encontré otra forma de hacer lo mismo. Mi pensamiento siempre ha sido que el almacenamiento local de subprocesos es probablemente más lento que el acceso directo (no estoy seguro de si esto es correcto). Sería curioso lo que otros piensan también. – dongola7

Respuesta

7

A gotcha para aplicaciones asp.net: el procesamiento de una sola solicitud puede cambiar los hilos, es decir, si hay solicitudes paralelas en la misma sesión. Debido a esto, todo lo que coloque en TLS antes del evento HttpApplication.PostRequireRequestState podría no estar allí más adelante, porque está en un hilo diferente.

[Editar por el autor de la pregunta]

Por mi caso en particular, que terminó la adición de un par clave-valor al diccionario SqlException.Data, que luego se recupero cuando registro de los detalles de la excepción. Esto me da la funcionalidad que esperaba usar el almacenamiento local de subprocesos.

+0

Esto es exactamente lo que estaba buscando. Sospeché que podría no ser confiable en este escenario. Gracias. –

+0

Esta es una respuesta antigua, pero para aclarar un poco: ASP.NET solo cambia de tema en escenarios muy específicos. El más grande es usar métodos async IO - ver p. Lhotka y Guthrie discutiendo: http://www.lhotka.net/WeBlog/PermaLink,guid,019e3c37-38ed-492e-b769-16e1a57fed0a.aspx – EBarr

6

El almacenamiento local de subprocesos es una forma rápida de arreglar una biblioteca que se diseñó antes de subprocesos y utiliza muchas variables globales y estáticas. Es la forma en que la biblioteca estándar C se hizo segura para subprocesos sin cambiar su interfaz (internamente, muchas funciones usan memorias intermedias estáticas).

En general, es bueno para ese propósito. Si tiene que tener datos globales en un entorno de subprocesos múltiples, entonces el almacenamiento local de subprocesos es una buena forma de hacerlo. Una razón común es que está llamando a una función de un tercero que lo llama de nuevo en el mismo marco de pila, pero no le da un gancho para pasar información adicional: esto sucede mucho cuando intenta envolver bibliotecas C antiguas. .RED.

Cuestiones relacionadas