2009-04-23 2 views
5

Я уже много раз обсуждал эту тему.Вопрос о C# и статических классах и функциях

Если у меня есть статический класс с статическими методами, который соединяется с базой данных или сервером, неудобно ли использовать эту функцию в многопользовательской среде (например, на веб-странице)? Стало бы это сделать протектор нового пользователя ждать, пока предыдущие потоки пользователей закончат свои звонки, прежде чем принимать новый?

Каковы были бы последствия этого для многопоточности?

Thx!

ответ

6

Если каждый статический метод полностью отвечает за приобретение своих ресурсов, а затем распоряжаться ИТС ресурсов в рамках вызова метода (без общего состояния), тогда у вас не должно быть проблем с потоковой обработкой, что у вас не будет использования классов экземпляров. Однако я бы предположил, что большая проблема заключается в том, что зависимость от публичных статических методов (в статических или нестатических классах) создает множество других проблем с дизайном в будущем.

  • Прежде всего, вы очень сильно привязываетесь к реализации, которая всегда плоха.
  • Во-вторых, тестирование всех классов, зависящих от ваших статических методов, становится очень трудным, потому что вы заблокированы для одной реализации.
  • В-третьих, создавать безопасные методы, отличные от потоков, становится очень легко, поскольку статические методы могут иметь только статическое состояние (которое используется во всех вызовах методов).
0

Немного странный этот вопрос. Почему вы так много статичны.

Но я думаю, что вы спрашиваете о многопоточности вопросов, так что я бы сказал, пойти проверить некоторые документы на резьб ч ttp://msdn.microsoft.com/en-us/library/c5kehkcz(VS.80).aspx

0

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

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

Но если ваше приложение немного сложнее, чем Hello World, вы должны подумать, что у вас есть методы не статические, а для использования объектно-ориентированных шаблонов.

3

Статические методы не имеют особого поведения в отношении многопоточности. То есть вы можете ожидать несколько «копий» метода, запущенного одновременно. То же самое касается статических переменных - разные потоки могут получить к ним доступ сразу, там нет ожиданий. И если вы не будете осторожны, это может создать хаос.

1

Да, это плохая идея.

При использовании одного соединения для всех пользователей, если кто-то выполняет действие, которое требует, позволяет сказать, 15 секунд, только для доступа к базе данных, все остальные пользователи должны будут ждать, чтобы подключиться к базе данных

+0

Плохая идея здесь заключается в использовании одного соединения, а не статических методов, ИМО. –

+0

Я согласен с тобой – Sergio

0

Если вы используете одно статическое соединение для доступа к базе данных, вам придется синхронизировать вызовы методов. Несколько потоков, запрашивающих базу данных для данных по одному соединению, будут ... ehhmmm ... беспорядок. Таким образом, вы сериализуете доступ к данным всех потоков, и это будет иметь большое влияние на производительность.

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

Если вы используете пул статических подключений, вы уменьшите это влияние на производительность, поскольку вам нужно только сериализовать доступ к пулу подключений.

Кроме того, статика в целом не является хорошим конструктивным делением - они делают модульное тестирование очень сложным. Вы должны использовать шаблон Singleton или Monostate.

0

Если вы делаете это , это не будет проблемой. Если вы делаете это неправильный, он имеет потенциальную силу последовательного доступа к ресурсу.

Иногда разница между правильным и неправильным может быть очень тонкой и трудно различимой, но главное, что ни один метод не должен полагаться или блокировать любое «состояние» (участников) класса.

0

Я использую статический метод для объектов поиска. Я могу управлять всеми объектами поиска в одном месте (используя кеширование) для приложения asp.net, и все методы называют его с помощью статического метода.

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