2009-04-23 3 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 응용 프로그램에 대해 모든 조회 객체를 한 곳에서 (캐싱을 사용하여) 관리 할 수 ​​있으며 모든 메서드는 정적 메서드를 사용하여 호출합니다.

이렇게하면 필요할 때마다 조회 객체를 인스턴스화 할 필요가 없으며 성능 향상을 위해 DB를 호출 할 필요가 줄어 듭니다.

관련 문제