CultureInfo поток безопасности - PullRequest
11 голосов
/ 21 июля 2010

У меня есть многопоточное приложение, которое анализирует некоторый текст, и ему нужно использовать информацию о английской культуре для анализа чисел из этого текста. Поэтому я не хочу создавать EngCulture каждый раз, когда вызываю функцию синтаксического анализа. В настоящее время я передаю EngCulture в качестве параметра, но меня это не устраивает. Я хочу определить EngCulture как статический член, чтобы он был доступен для потоков.

Документация Msdn гласит, что "Любые открытые статические (Shared в Visual Basic) члены этого типа являются поточно-ориентированными. Любые члены экземпляра не гарантируют поточно-ориентированные." Я просто использую следующую функцию, так как я могу узнать, использует ли TryParse какие-либо экземпляры членов EngCulture или нет?

public static CultureInfo EngCulture = new CultureInfo("en-US", false);

void parser()
{
    if (int.TryParse(value, NumberStyles.Number, EngCulture, out num))...
}

Ответы [ 5 ]

6 голосов
/ 21 июля 2010

Попробуйте использовать CultureInfo.GetCultureInfo("en-US"), который "извлекает кэшированный экземпляр культуры, доступный только для чтения, с использованием указанного имени культуры."

http://msdn.microsoft.com/en-us/library/yck8b540.aspx

или сделайте свое поле доступным только для чтения, чтобы вам не понадобился замок:

private static CultureInfo _culture = CultureInfo.ReadOnly(new CultureInfo("en-US"));
3 голосов
/ 21 июля 2010

Для обеспечения безопасности потоков вы можете создать культуру только для чтения, используя статический метод CultureInfo.ReadOnly:

public static CultureInfo EngCulture = CultureInfo.ReadOnly(
    new CultureInfo("en-US", false));
1 голос
/ 21 июля 2010

Вы можете установить CultureInfo определенного потока с помощью System.Threading.Thread.CurrentThread.CurrentCulture = myCI;, чтобы вам не приходилось передавать его каждый раз при вызове функции.

Обратите внимание, что простой доступ к получателям из нескольких потоков не будетвред в большинстве случаев, если вы не модифицируете объект.

0 голосов
/ 21 июля 2010

Две точки:

Я не хочу создавать EngCulture каждый раз, когда вызываю функцию синтаксического анализа

Не думаю, что это на самом деле слишком многобеспокойство - CultureInfo не будут особенно большими, а что касается производительности, «встроенные» фактически кэшируются, поэтому все, что делает new, это извлекает существующий объект.Обязательно запишите профиль и посмотрите, действительно ли это проблема ...

Как я могу узнать, использует ли TryParse какие-либо члены-экземпляры EngCulture или нет?

IЯ был бы очень удивлен, обнаружив метод, который принял a CultureInfo и затем изменил , что CultureInfo любым способом.Хотя они на самом деле не являются формально неизменяемыми, я бы использовал их (особенно «встроенные»), как если бы они были неизменяемыми, не задумываясь.

Итак, я бы сказал, что есть статический new CultureInfo("en-US", false) и передайте его - ничто не поменяет его, поэтому проблем с многопоточностью не возникает.

0 голосов
/ 21 июля 2010

«Члены» означают методы плюс операторы плюс поля плюс свойства. Вы используете элемент экземпляра и поэтому должны использовать lock или найти альтернативный способ сделать это.

Надеюсь, это поможет!

...