C# 在C语言中处理静态场内存泄漏的最佳实践#

C# 在C语言中处理静态场内存泄漏的最佳实践#,c#,memory-leaks,static-members,C#,Memory Leaks,Static Members,我应该为用户的当前实例创建一个上下文对象,代码是 public class WorkoutContext { protected static WorkoutContext mWorkoutContext ; protected WorkOut mWorkOut; protected WorkoutContext(WorkOut workout) { mWorkOut= workout; } public static Wor

我应该为用户的当前实例创建一个上下文对象,代码是

 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
实例,但在请求过程完成后不释放该实例。为了克服这个问题,修改了
CreateContext
方法如下

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);
   }
}

对于同一个
训练
实例,是否有其他方法可以实现只有一个
训练上下文
实例。

尝试以下方法:

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;
        }
    }
}
公共类上下文{
保护性锻炼;
私有静态字典dic=new。。。;
私有静态对象lockObj=新对象();
受保护的训练上下文(训练)
{
M运动=锻炼;
}
公共静态训练上下文CreateContext(训练)
{   
锁(lockObj){
if(集装箱驾驶员(训练))
返回dic[训练];
var wc=新的训练上下文(训练)
dic.添加(训练,wc);
返回wc;
}
}
}

建议的方法将对象实例保存在字典中,用户完成其过程后,我们可以删除实例的频率。例如,在温莎,有一种生活方式来保存对请求完成的对象实例更新。(PerWebRequestLifeStyle)使用温莎城堡是否有可能克服这种情况。