Потокобезопасность CultureInfo

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

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

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

void parser()
{
    if (int.TryParse(value, NumberStyles.Number, EngCulture, out num))...
}
11
задан lockedscope 21 July 2010 в 11:02
поделиться

5 ответов

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

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

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

private static CultureInfo _culture = CultureInfo.ReadOnly(new CultureInfo("en-US"));
6
ответ дан 3 December 2019 в 10:03
поделиться

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

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

1
ответ дан 3 December 2019 в 10:03
поделиться

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

public static CultureInfo EngCulture = CultureInfo.ReadOnly(
    new CultureInfo("en-US", false));
3
ответ дан 3 December 2019 в 10:03
поделиться

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

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

0
ответ дан 3 December 2019 в 10:03
поделиться

Два момента:

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

Я не думаю, что это на самом деле будет слишком большой проблемой - CultureInfo s aren ' t будет особенно большим, а что касается производительности, «встроенные» фактически кэшируются, поэтому все, что делает new , - это извлекает существующий объект. Во что бы то ни стало профилируйте и посмотрите, действительно ли это проблема ...

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

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

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

0
ответ дан 3 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: