2013-09-05 3 views
1

C#으로 정적 필드에 대한 메모리 누수를 처리하기 위해, 그리고 코드는 각 사용자에 대한 동시 환경에서모범 사례 내가 사용자의 현재 인스턴스에 대한 컨텍스트 개체를 만들 수 있겠

public class WorkoutContext { 
    protected static WorkoutContext mWorkoutContext ; 
    protected WorkOut mWorkOut; 

    protected WorkoutContext(WorkOut workout) 
    { 
     mWorkOut= workout; 
    } 

    public static WorkoutContext CreateContext(WorkOut workout)) 
    { 
     if (mWorkoutContext == null) 
     { 
      mWorkoutContext = new WorkoutContext (form); 
     } 
     else 
     { 
      if (workout != mWorkoutContext.WorkOut) 
      { 
       mWorkoutContext = new WorkoutContext (workout); 
      } 
     } 
     return mWorkoutContext ; 
    } 
} 

입니다 WorkOutContext에 대한 인스턴스를 만들지 만 요청 프로세스 완료 후 인스턴스를 릴리스하지 않습니다.

public class WorkoutContext { 
    protected WorkoutContext mWorkoutContext ; 
    protected WorkOut mWorkOut; 

    protected WorkoutContext(WorkOut workout) 
    { 
     mWorkOut= workout; 
    } 

    public static WorkoutContext CreateContext(WorkOut workout)) 
    {  
     return new WorkoutContext(workout); 
    } 
} 

같은 WorkOut 예를 들어 WorkoutContext 인스턴스를 하나만 가지고 구현하는 다른 방법이 있나요를 따를 때이 문제가 CreateContext 방법을 수정 극복합니다. 이 같은

답변

1

시도 뭔가 :

public class WorkoutContext { 
    protected WorkOut mWorkOut; 
    private static Dictionary<WorkOut, WorkoutContext> dic = new ...; 
    private static object lockObj = new object(); 

    protected WorkoutContext(WorkOut workout) 
    { 
     mWorkOut= workout; 
    } 

    public static WorkoutContext CreateContext(WorkOut workout) 
    { 
     lock(lockObj) { 
      if (dic.ContainsKey(workout)) 
        return dic[workout]; 
      var wc = new WorkoutContext(workout) 
      dic.Add(workout, wc); 
      return wc; 
     } 
    } 
} 
+0

사전에 개체 인스턴스를 개최한다 제안 된 방법으로, 우리는 사용자 완료 그의 처리 후 인스턴스를 삭제할 수 있습니다 빈도. 전의. 윈저에는 완성 된 요청에 대한 객체 인스턴스 업데이트를 유지하는 라이프 스타일이 있습니다. (PerWebRequestLifeStyle) 윈저 성과 함께이 시나리오를 극복 할 수 있습니다. – VIJAY