2009-11-02 11 views
29

Necesito saber si es seguro para crear un objeto Regex estático como sigue:es válido para crear un objeto Regex estática para ser utilizado por todos los hilos en una aplicación ASP.NET?

public static Regex s_Regex_ExtractEmails = new Regex(@"\b[A-Z0-9._%+-][email protected](?:[A-Z0-9-]+\.)+[A-Z]{2,4}\b"); 

y lo llaman de forma estática a partir de hilos de ASP.NET como este:

s_Regex_ExtractEmails.Matches("my email is [email protected]") 

¿Esto causa ningún problema?

estoy haciendo esto, básicamente, como una optimización para que el objeto Regex puede precompila y reutilizarse.

+0

Posible duplicado de [¿Es seguro el hilo de la instancia de Regex para las coincidencias en C#] (https://stackoverflow.com/questions/13129287/is-regex-instance-thread-safe-for-matches-inc-c-sharp) –

Respuesta

35

Sí, Regex objetos son seguros para subprocesos. De the docs:

La clase Regex es inmutable (sólo lectura) y es inherentemente hilo seguro. Los objetos Regex pueden crearse en cualquier hilo y compartirse entre hilos.

Es posible que desee considerar el uso de RegexOptions.Compiled también - aunque no lo asumen que va a ayudar el rendimiento; ¡medida!

+0

** Advertencia **: los objetos de resultado ('Match' y' MatchCollection') devueltos por Regex deberían usarse en un único hilo. [Ver doc] (https://msdn.microsoft.com/en-us/library/6h453d2h.aspx) – Tonio

2

no sólo es seguro, se recomienda utilizar de esta manera cuando pueda. Este enfoque mejorará el rendimiento de su aplicación.

1

que utiliza una expresión regular estático en una aplicación web y resultó ser un cuello de botella que todas las peticiones utilizan la misma instancia única.

Reescribí la función por lo que se creó una nueva Regex para cada llamada y problema resuelto.

La aplicación puede haber correr más rápido a niveles de uso bajos pero a niveles muy altos de uso que no escala bien.

Cuestiones relacionadas