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)使用温莎城堡是否有可能克服这种情况。