Безопасно ли использовать глобальные переменные C # в фоновом рабочем потоке - PullRequest
4 голосов
/ 23 декабря 2010

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

Моя проблема тамявляется тяжелым классом с именем UCSProject, который содержит много строковых полей и полей List, мне нужно передать экземпляр этого класса фоновому работнику, так как этот класс немного тяжелый, я хотел бы уменьшить количество повторяющихся экземпляров с помощьюГлобальная переменная напрямую, вместо того, чтобы передавать ее в качестве аргумента фоновому рабочему.

Если коротко, я просто хочу знать, безопасно ли обращаться к глобальным переменным из потока фонового рабочего в C #

Ответы [ 6 ]

5 голосов
/ 23 декабря 2010

Это безопасно, если только оба ваших потока (фоновый и обычный) не изменяют объект.

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

3 голосов
/ 23 декабря 2010

По вашему вопросу я подозреваю, что вы не понимаете, как работают переменные для классов. Вам не нужна глобальная переменная, чтобы иметь только одну копию вашего объекта. Все переменные будут указывать на один и тот же объект, если только вы не Clone его не создадите или не создадите новый со старым в качестве прототипа.

Глобальная переменная, другими словами, ничего не изменит, если вы явно не создадите новые копии, как описано в предыдущем абзаце.

Мне также интересно, насколько тяжелым может быть ваш класс, если вы думаете, что представление пострадает от создания его копий? Сколько мб это весит?

Обновление

Эта серия статей подробно описывает, что такое куча и стек: http://www.c -sharpcorner.com / uploadfile / rmcochran / csharp_memory01122006130034pm / csharp_memory.aspx

1 голос
/ 23 декабря 2010

Если вы не изменяете какие-либо строки или переменные, вам не нужно блокировать.

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

Если вам нужно изменить или обновить данные - используйте Lock .

1 голос
/ 23 декабря 2010

Нет, это не так, если только вы не блокируете его с помощью lock(object) { } всякий раз, когда используете любое из его полей данных.

1 голос
/ 23 декабря 2010

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

См. « Заявление о блокировке » в библиотеке MSDN.

0 голосов
/ 19 июня 2015

Вы также можете использовать [ThreadStatic].Значение переменной будет уникальным для каждого потока.См. MSDN , чтобы узнать, как его использовать.

...