Можно ли создать статический объект Regex, который будет использоваться всеми потоками в приложении ASP.NET?
Мне нужно знать, безопасно ли создавать статический объект Regex следующим образом:
public static Regex s_Regex_ExtractEmails = new Regex(@"\b[A-Z0-9._%+-][email protected](?:[A-Z0-9-]+\.)+[A-Z]{2,4}\b");
И назовите его статически из потоков ASP.NET следующим образом:
s_Regex_ExtractEmails.Matches("my email is [email protected]")
Из-за этого возникнут проблемы?
Я делаю это в основном как оптимизация, так что объект Regex можно предварительно скомпилировать и повторно использовать.
Ответы
Ответ 1
Да, объекты Regex
являются потокобезопасными. Из документы:
Класс Regex неизменен (только для чтения) и по сути является потоком безопасно. Объекты регулярных выражений могут быть созданы на любой поток и разделяемый между потоками.
Возможно, вы захотите также использовать RegexOptions.Compiled
- хотя не предполагайте, что это поможет производительности; измерение!
Ответ 2
Не только безопасно, рекомендуется использовать его так, как только сможете. Такой подход улучшит производительность вашего приложения.
Ответ 3
Я использовал статическое Regex в веб-приложении, и это оказалось узким местом, поскольку все запросы использовали один и тот же единственный экземпляр.
Я переписал функцию, так что для каждого вызова и проблемы было создано новое Regex.
Приложение может работать быстрее при низком уровне использования, но при очень высоких уровнях использования он недостаточно масштабируется.