在MVC / WebAPI环境中,我会使用InRequestScope
绑定DbContext
。
但是,我现在处于Console应用程序/ Windows服务/ Azure辅助角色(并不重要,只是没有Web请求范围),它会定期创建一些异步运行的Tasks
。我希望每个任务都有自己的DbContext
,并且由于任务在他们自己的线程上运行,我尝试使用DbContext
绑定InThreadScope
。
不幸的是,我意识到任务完成时不会处理DbContext。实际发生的是,线程返回线程池,当它被分配一个新任务时,它已经有一个DbContext,所以DbContexts永远保持活着。
有没有InThreadScope
可以在这里使用的方式,还是应该使用其他范围?当线程从ThreadPool中不时返回时,如何使用ThreadScope?
答案 0 :(得分:1)
如果您决定继续使用自定义范围,解决方案是:
Bind<DbContext>().To<MyDbContext>().InScope(c => CurrentScope.Instance)
结合:
using (CurrentScope.Instance)
{
// your request...
// you'll get always the same DbContext inside of this using block
// DbContext will be disposed after going out of scope of this using block
}
最后:
return K.mean((y_true+K.epsilon()) * K.square(y_pred - y_true), axis=-1)