我们在asp.net mvc应用程序(C#/ VS 2k15)上使用“通过请求一个数据库连接”模式。 基本上,我们在BeginRequest上创建一个DbContext,在EndRequest上创建Dispose()。
我曾经将这个DbContext保存在HttpContext上,但是遇到了一个稍微复杂的场景,我们需要运行多个线程,并且由于HttpContext在线程之间不共享,因此该解决方案停止工作。
首先我想使用CallContext,但是它的对象应该是可序列化的,而不是DbContext。
我想到的(非可选)解决方案是将DbContexts保存在公共静态词典中,其中的键(长)是线程ID,但我认为有更好的解决方案。
在线程之间共享DbContext的最佳解决方案是什么?
谢谢。
答案 0 :(得分:6)
在线程之间共享DbContext的最佳解决方案是什么?
不这样做。一个DbContext实例不能被多个线程同时访问。
只需让您的后台进程在using
块中创建一个新的DbContext。基础数据库连接已池化,将被重用。
如果您只想跨单个HTTP请求发出的Task传递DbContext实例,并且可以保证两个并发Task或Thread不会访问它,则可以使用AsyncLocal。 / p>
您还可以capture引用DbContext的局部变量,并将其显式传递给您等待的任务。 EG
await Task.Run(() =>
{
var e = db.MyEntity.First();
//. . .
});
答案 1 :(得分:0)
我建议不要这样做。
但是,如果您坚持使用它并且正在使用Inversion of Control库,那么它很可能会支持Per thread lifestyle