Потокобезопасность в ASP.Net MVC - PullRequest
6 голосов
/ 09 июля 2009

Я подозреваю, что это относится и к общему ASP.Net, но я не уверен.

Если у меня есть метод действия на контроллере, скажем, MyController.DoSomethingExciting, и три клиента обращаются к нему «одновременно», является ли он по сути потокобезопасным, или мне нужно что-то сделать, чтобы три параллельных вызова не не общаетесь друг с другом?

Ответы [ 3 ]

13 голосов
/ 09 июля 2009

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

Но если есть какие-либо статические или другие общие участники, тогда они небезопасны.

2 голосов
/ 28 января 2014

Не обязательно. Зависит от того, что вы подразумеваете под «безопасностью потоков».

Предположим, например, что они совместно используют Entity Framework, скажем "db", и работают с какой-то таблицей. так как вы назвали свой контроллер "MyController", давайте вызовем этот db.MyTable Каждый запрос вызывает другой экземпляр MyController. Пока что, поток безопасен. Каждый контроллер создает экземпляр MyEntities db = new MyEntities (); До сих пор нить безопасна. но поскольку db.MyTable имеет тип IEnumerable , они взаимодействуют друг с другом. Предположим, они работают с одним и тем же объектом в базе данных (без блокировок), скажем, db.MyTable [0] - они будут перезаписывать друг друга («последний, кто спасет выигрыши»).

3 пользователя вашего сайта будут иметь три независимых указателя (в стеке), указывающих на одно и то же место (в базе данных). Это не проблема потока. Это проблема блокировки данных.

2 голосов
/ 09 июля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...