Подтвердить что ты не робот

Можно ли создать статический объект 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 можно предварительно скомпилировать и повторно использовать.

4b9b3361

Ответ 1

Да, объекты Regex являются потокобезопасными. Из документы:

Класс Regex неизменен (только для чтения) и по сути является потоком безопасно. Объекты регулярных выражений могут быть созданы на любой поток и разделяемый между потоками.

Возможно, вы захотите также использовать RegexOptions.Compiled - хотя не предполагайте, что это поможет производительности; измерение!

Ответ 2

Не только безопасно, рекомендуется использовать его так, как только сможете. Такой подход улучшит производительность вашего приложения.

Ответ 3

Я использовал статическое Regex в веб-приложении, и это оказалось узким местом, поскольку все запросы использовали один и тот же единственный экземпляр.

Я переписал функцию, так что для каждого вызова и проблемы было создано новое Regex.

Приложение может работать быстрее при низком уровне использования, но при очень высоких уровнях использования он недостаточно масштабируется.