Вопрос о C # и статических классах и функциях - PullRequest
5 голосов
/ 23 апреля 2009

Я видел много дискуссий на эту тему здесь.

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

Какое значение это может иметь и многопоточность?

Thx!

Ответы [ 8 ]

6 голосов
/ 23 апреля 2009

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

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

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

1 голос
/ 23 апреля 2009

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

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

0 голосов
/ 23 апреля 2009

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

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

0 голосов
/ 23 апреля 2009

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

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

0 голосов
/ 23 апреля 2009

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

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

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

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

0 голосов
/ 23 апреля 2009

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

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

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

0 голосов
/ 23 апреля 2009

Этот вопрос немного утомил. Относительно того, почему у вас так много статики.

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

...