2012-07-06 2 views
3

싱글 톤을 포함하는 DLL을 참조하는 ASP.Net 응용 프로그램이 있습니다. 싱글 톤에는 공개적으로 액세스 할 수있는 메서드가 두 개뿐이며 공용 속성이 없습니다. 웹 응용 프로그램은 Application_Start 중에이 싱글 톤의 인스턴스를 만듭니다. 이것은 응용 프로그램 수명 기간 동안 사용할 수 있습니다.ASP.Net 응용 프로그램에서 싱글 톤 공개 메서드 잠금 또는

싱글 톤은 타사 응용 프로그램에 대한 연결을 유지하고 타사 응용 프로그램에서 발생하는 여러 가지 이벤트를 수신합니다. 이러한 이벤트는 싱글 톤 내에서 발생하여 언제든지 기록되고 처리됩니다.

사용자가 웹 응용 프로그램에 액세스 할 때 사용자의 요청에 따라 싱글 톤에 대한 공용 메서드가 사용되며 개인 멤버 데이터를 사용하여 제 3 자 응용 프로그램에서 메서드를 호출합니다. 이러한 호출은 try ... catch 블록 내에 있습니다.

스레드 안전을 유지하기 위해 public 메서드를 잠글 수 있습니까? 그렇다면 잠금 목적으로 만 사용되는 System.Object 형식의 단순 private 멤버이면 충분합니까?

여기에 싱글 톤의 '의사 코드'가 있습니다. 나는 나의 질문을 이해할 수있게 해주기를 바란다.

using My3rdPartyDLL; 

public sealed class MySingleton 
{ 
    private static MySingleton instance = new MySingleton(); 
    private Object lockObj = new Object(); 

    private My3rdPartyAPI myAPI = null; 


    public static MySingleton Instance 
    { 
     get{ return instance; } 
    } 

    static MySingleton() 
    { 
    } 

    private MySingleton() 
    { 
     Initialise(); // Creates third party API and hooks up events. 
    } 

    // Here is the public method that I want to ensure is 
    // thread safe. 
    public void SomePublicMethod(String myString) 
    { 
     lock (lockObj) 
     { 
      try 
      { 
       My3rdPartyDLL.MyMethod(myString); 
      } 
      catch (Exception ex) 
      { 
       // deal with exception 
      } 
     } 
    } 

    private void My3rdParty_Event(EventObj obj) 
    { 
     MyEventLogger.WriteToLog(obj); 
    } 
} 
+0

왜이 경우에 '싱글 톤'을 사용해야한다고 생각하십니까? 제 3 자 소프트웨어에 이미 하나가 있다면, 그것은 각 사용자가 자신의 고유 한 세션을 가질 것이므로 자신의 싱글 톤이 이미 존재한다고 생각하면 무의미한 것처럼 보입니다. –

+0

@Ramhound : 싱글 톤은 넓은 응용 프로그램입니다. 그래서 하나의 인스턴스/세션. 그렇지 않으면 싱글 톤이 아닌 컨텍스트 인스턴스가됩니다. –

+2

잠금이 필요한지 아닌지는'My3rdPartyDLL.MyMethod'가 스레드로부터 안전한지 여부에 달려 있습니다. 싱글 톤이되면 나를 믿을 수 있습니다. 그러나 아마도 당신은 그것에 대해 더 많이 알고 그것을 확인할 수 있습니다. –

답변

1

좋은 점은 있지만, 제 3 자 스레드 안전한지에 대한 지식은 나에게 사용할 수 없습니다 입니다. 그래서, 내 웹 응용 프로그램과 API 사이에 단 하나의 결속 지점을 유지하기 위해 싱글 톤을 만들었습니다. 그렇다면 내가 타사 API가 스레드 안전하다고 확신 할 수 없다면 방어해야하며 내 코드에서 처리해야합니다. 아마도 난 그냥 내 자신의 대답 질문에 대답했습니다 ...이 경우에는 lockworkj 좋은 방법을 사용하고 있습니까?

외부 메서드가 스레드로부터 안전한지 여부를 확신 할 수 없다는 가정하에 호출을 동기화하는 것이 좋습니다.

정적 인 lockObj을 잠글 수 있지만 성능에주의하십시오. 매초 많은 요청을 처리하는 경우 문제가 발생할 것입니다 (모니터를 해제하라는 다른 요청을 기다리는 요청). 매 요청마다 메소드가 호출되거나 한 번만 종료/요청 (또는 그 이상) 될 경우, .

단일 방법을 잠그기 때문에 lock으로 문제가되지 않습니다. 그래서 여기 ManualResetEvent, Monitor 및 대안에 대한 실제 사용하지 않습니다.

+0

싱글 톤 공용 메서드가 매우 특정한 웹 응용 프로그램 이벤트에서만 호출된다는 사실을 알고 싶을 때 클라이언트 요청에 대한 일반적인 질문을했습니다. 또한 35 명의 사용자가있는 회사의 내부 애플리케이션이므로 n 분당 최대 1 건의 요청을 처리 할 수 ​​있습니다. 이 기초 위에서 나는 lockOBj를 고수 할 것입니다. 드물게 2 ~ 3 명의 사용자가 동일한 일을하고 있습니다. 도와 주셔서 감사합니다. 나중에 Monitor와 ManualResetEvent에 대해 배우게 될 것입니다. – iWeasel

관련 문제