2009-09-16 2 views
1

이 시점까지 내가 작성했거나 사용했던 모든 .NET 원격 코드가 SingleCall로 노출되었습니다..NET Remoting에서 싱글 톤 대 싱글 콜 사용하기?

싱글 톤으로 노출 된 Windows 서비스에서 호스팅되는 .NET Remoting 구성 요소를 가로 질렀습니다.

이 객체는 동시에 하나 이상의 클라이언트가 호출 할 수있는 잠재력을 가지고 있으며, 그것의 내부 상태를 보호하기 위해 어떠한 잠금 또는 다른 규정이 없습니다.

내가 Singleton을 올바르게 이해한다면 큰 문제가 발생할 가능성이 있습니까?

+0

"내부 상태를 보호 할 수있는 잠금 장치 나 다른 조항이 없습니다"... 그게 싱글 톤이 맞습니까? 단일 스레드로 (초기) 구성을 제한하려면 자물쇠가 있어야한다는 것을 이해합니다. –

답변

8

SingleCall 구성 요소보다 더 큰 잠재력은 없습니다. 안전하지 않은 방식으로 공유 메모리 위치에 액세스하려고하면 두 가지 모두 문제가 발생합니다.

에서는 SingleCall과 싱글의 차이

가에서는 SingleCall에 대한 모든 들어오는 요청이 그 통화를 처리하기 위해 만든 정의 형의 새로운 인스턴스를 얻을 것이다 것입니다. 각 인스턴스는 자체 메모리 공간과 인스턴스 변수를 갖지만 정적 변수와 전역 변수, 외부 리소스, 파일, 네트워크 연결 등을 여전히 공유 할 수 있습니다. SingleCall 클래스가 스레드가 안전하지 않은 방식으로 공유 메모리 상태에 액세스하도록 코딩 된 경우 그러면 문제가 발생할 것입니다.

싱글, 다른 한편으로는, 단지 그렇게 정의에 들어오는 모든 요청을 만들어 하나 개의 인스턴스를 가져, 그 싱글에서 사용중인 모든 인스턴스 변수는, 사실, 들어오는 모든 요청들 사이에서 공유됩니다. 좋은 예가 서버의 모든 코드가 하나 이상의 가입 된 클라이언트에게 메시지를 보내기 위해 액세스해야하는 메시지 게시자 일 수 있습니다 ....

@Cocowalla의 의견을 처리하려면이 작업을 재정의하십시오 방법

표시, 또는 아무도 잠시 동안 그것을 호출하지 않는 경우 귀하의 싱글이 예기치 않게 죽을 것 같은
MarshalByRefObject.InitializeLifetimeService() 

...

public class MessageManager : MarshalByRefObject 
{ 
    #region Singleton/MarshalByRefObject code   
    private static MessageManager mgr = 
     new MessageManager(); // creates singleton 
    static MessageManager() { } 
    private MessageManager() { } 
    public static MessageManager Instance { get { return mgr; } } 
    public override object InitializeLifetimeService() { return (null); } 
    #endregion Singlelton code 
    // ... other stuff ... 
} 

    // in Remoting Host initialization code...  
    MessageManager mgr = MessageManager.Instance; // generates singleton; 
    RemotingServices.Marshal(mgr, URI); 
+0

싱글 톤의 수명은주의해야합니다. 구성에 따라 앱이 실행되는 동안 주변에있을 것으로 예상되는 싱글턴은 실제로 자동으로 삭제되고 다시 생성 될 수 있습니다. Remoting에서 싱글 톤은 주어진 "임대"또는 "수명"을 가지며, 그 후에 자동으로 소멸됩니다. 수명을 변경하거나 무기한 연장 할 수는 있지만 알아 둘 사항입니다. 좀 더 읽기 : http://www.thinktecture.com/resourcearchive/net-remoting-faq/singletonisdying http://msdn.microsoft.com/en-us/magazine/cc300474.aspx – Cocowalla

2

예. 호출자가 객체의 내부 상태를 변경하고 해당 메서드가 스레드로부터 안전하지 않으면 문제가 발생할 수 있습니다. 해당 서버는 단일 호출이어야합니다.

그러나 서버 객체가 자원을 공유 액세스에 (그리고? 유용한 어떤 서버를 않습니다), 심지어 단일 호출 서버 문제로 얻을 수 있다면 찰스, 지적으로

. 아직도, 그 문제는 더 다루기 쉽다. 예를 들어 데이터베이스에 대한 액세스는 트랜잭션이 가능하므로 안전 할 수 있습니다.

결론 : 단일 통화에 가고는 '반'당신의 문제를 제거하기 간단하고 효과적인 방법입니다. 그것에 집착하십시오.