2012-01-15 2 views
4

SOAP WCF 서비스 끝점을 제공하는 서버가 있습니다. 이 서버는 또한 동일한 클러스터의 다른 서버와 통신하기 위해 Ensemble이라는 그룹 통신 프레임 워크 (질문과 관련이 없음)를 사용합니다.C# 및 WCF의 스레드간에 개체 공유

다른 서버에서 들어오는 메시지를 수신하는 별도의 스레드와 호출 될 때 WCF 루틴을 실행하는 스레드간에 개체/데이터를 공유해야합니다. 지금까지 내가 생각할 수있는 가장 간단한 작업을 수행했습니다. 정적 멤버와 정적 메서드를 사용하여 정적 "데이터베이스"클래스를 만들고 lock()을 사용하여 동기화했습니다. 이렇게하면 서버와 그룹 통신 스레드에서이 클래스에 액세스 할 수 있습니다. 내 문제는 이것이 전체적으로 "OOP 일"을 깨뜨리고 좀 더 영리한 것이 여기에서 할 수 있다고 생각합니다 ...

+0

OOP 성과를 위해 노력하는 것은 그 자체로 결코 목표가되어서는 안됩니다. – diggingforfire

+0

"OOP thing"은 어떻게 깨지나요? OOP는 쓰레드와 쓰레드 간의 객체 공유에 대해서는 아무 말도하지 않습니다. –

답변

3

유일한 해결책은 "OOP가 아닌" edness "라면 Singleton Pattern 대신 사용할 수 있습니다. 이는 연결이 끊어져있는 시스템의 여러 부분간에 공유해야하는 클래스의 단일 인스턴스를 가져야하는 경우에 널리 사용되는 패턴입니다. 패턴은 다소 논란의 여지가 있습니다. 일부 사람들은 그것을 글로벌 변수의 영광스러운 버전으로 간주하기 때문에 다소 논란의 여지가 있지만 작업을 완료하는 데는 효율적입니다.

0

다른 서버의 수신 메시지를 수신하는 별도의 스레드를 클래스로 캡슐화하여 MyCustomService라고합니다.

를 들면, ConcurrencyMode 여러 및 InstanceContextMode 단일

WCF 서비스 구현 클래스 내부 이벤트 delagate 쓰기 등의 행동으로 WCF 서비스 구현 클래스를 작성한다. 대리자는 MyCustomService 클래스의 형식을 반환합니다.

WCF 서비스를 프로그래밍 방식으로 인스턴스화 (host.Open)하기 전에 위임을 단일 또는 정적 일 수있는 MyCustomService 인스턴스를 반환하는 함수로 설정합니다.

서비스 인스턴스 클래스에서 항상 위임자를 호출하여 MyCustomService 인스턴스를 가져올 수 있습니다. 그러나 null을 확인하십시오.

관련 문제