В моем приложении у меня есть статический метод, который вызывается из нескольких потоков одновременно. Есть ли опасность перепутать мои данные?
В моей первой попытке метод не был статическим, и я создавал несколько экземпляров класса. В этом случае мои данные как-то перепутались. Я не знаю, как это происходит, потому что это случается лишь иногда. Я все еще отлаживаю. Но сейчас метод статичен, пока проблем нет. Может, это просто удача. Точно не знаю.
c#
multithreading
static
TalkingCode
источник
источник
Ответы:
Переменные, объявленные внутри методов (за возможным исключением « захваченных » переменных), изолированы, поэтому вы не получите никаких внутренних проблем; однако, если ваш статический метод обращается к какому-либо общему состоянию, все ставки отключены.
Примеры общего состояния:
Если у вас общее состояние, вы должны либо:
whatever.SomeData
повторной ссылки вы читаетеwhatever.SomeData
один раз в локальную переменную, а затем просто используйте переменную - обратите внимание, что это помогает только для неизменяемого состояния!)источник
Да это просто удача. ;)
Не имеет значения, является ли метод статическим или нет, важно, являются ли данные статическими или нет.
Если у каждого потока есть собственный отдельный экземпляр класса с собственным набором данных, нет риска смешивания данных. Если данные статические, имеется только один набор данных, и все потоки используют одни и те же данные, поэтому нет способа не перепутать их.
Когда ваши данные в отдельных экземплярах по-прежнему смешиваются, это, скорее всего, связано с тем, что данные на самом деле не разделены.
источник
It doesn't matter if the method is static or not, what matters is if the data is static or not
. Чтобы добавить, локальные переменные, объявленные в рамках статического метода, не образуют ту часть данных, о которой нам нужно беспокоиться в данном сценарии.Статические методы должны подходить для нескольких потоков.
Статические данные, с другой стороны, могут вызвать проблему, потому что попытки доступа к одним и тем же данным из разных потоков необходимо контролировать, чтобы гарантировать, что только один поток одновременно читает или записывает данные.
источник
MSDN всегда говорит:
Изменить: как говорят здесь ребята, это не всегда так, и, очевидно, это относится к классам, разработанным таким образом в BCL, а не к пользовательским классам, где это не применяется.
источник