我在Web应用程序中使用OWIN + Microsoft.AspNet.Identity.Owin(v.2.0.0.0).我按照广泛推荐的方式为每个Web请求注册UserManager/DbContext:
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
Run Code Online (Sandbox Code Playgroud)
但都没有处理过.我瞥了一眼反射器,看起来像扩展方法中的一个bug:
public static IAppBuilder CreatePerOwinContext<T>(this IAppBuilder app, Func<IdentityFactoryOptions<T>, IOwinContext, T> createCallback) where T: class, IDisposable
{
if (app == null)
{
throw new ArgumentNullException("app");
}
if (createCallback == null)
{
throw new ArgumentNullException("createCallback");
}
object[] args = new object[1];
IdentityFactoryOptions<T> options = new IdentityFactoryOptions<T> {
DataProtectionProvider = app.GetDataProtectionProvider()
};
IdentityFactoryProvider<T> provider = new IdentityFactoryProvider<T> {
OnCreate = createCallback
};
options.Provider = provider;
args[0] = options;
app.Use(typeof(IdentityFactoryMiddleware<T, IdentityFactoryOptions<T>>), args);
return app;
}
Run Code Online (Sandbox Code Playgroud)
IdentityFactoryProvider有两个回调 - 创建和dispose,但是这里没有注册dispose回调.我也证实了我对记忆探测器的怀疑.
我没有在codeplex/github上看到Owin(实际上我认为它是开源的),所以我不知道在哪里问我的问题:还有其他人可以确认这是内存泄漏吗?我不确定,因为谷歌没有说它,我希望它应该在任何地方讨论,如果这是一个错误.
最近在分析会话期间,一种方法引起了我的注意,在profiler的反编译版本中看起来像这样:
public static double dec2f(Decimal value)
{
if (value == new Decimal(-1, -1, -1, true, (byte) 0))
return double.MinValue;
try
{
return (double) value;
}
catch
{
return double.MinValue;
}
}
Run Code Online (Sandbox Code Playgroud)
这是多年前编写的遗留代码的一部分,根据分析器(处于采样模式),这种方法浪费了太多时间.在我看来,这是因为try-catch阻止了内联,我花了一些时间来刷新关于十进制到双转换技巧的记忆.确保此转换无法抛出后,我删除了try-catch块.
但是,当我再次查看源代码的简化版本时,我想知道为什么反编译版本显示奇怪的Decimal构造,而它是简单的Decimal.MinValue用法:
public static double dec2f(decimal value)
{
if (value == DecimalMinValue)
{
return Double.MinValue;
}
return (double)value;
}
Run Code Online (Sandbox Code Playgroud)
首先,我认为这是一个反编译器的bug,但幸运的是它还显示了IL版本的方法:
public static double dec2f(Decimal value)
{
if (value == new Decimal(-1, -1, -1, true, (byte) 0))
.maxstack 6
.locals init (
[0] float64 V_0
)
IL_0000: ldarg.0 …Run Code Online (Sandbox Code Playgroud)