在后台线程上使用DbContext

时间:2013-11-22 05:35:40

标签: asp.net-mvc multithreading entity-framework

我的MVC4应用程序使用代码优先的Entity Framework 5.0。我想从计时器线程访问我的SQL Server数据。是否有任何理由我无法实例化,使用和处置我在主ASP.NET工作线程上也使用的相同派生DbContext类的实例? (是的,我使用相同的using()模式来实例化,使用和处置主线程上的对象。)

一个小问题上下文:我的网站在数据库的表中有一个WebsiteEnabled字段。目前,我为每个GET请求引发数据库提取以读取该值。我想更改代码以在后台线程上每15秒读取一次值,并将值存储在GET请求可以读取的静态变量中。我知道如果你试图在同一个线程上实例化同一个DbContext的多个实例,你会遇到问题。我不确定相同的限制是否适用于不同线程上相同DbContext的实例。

2 个答案:

答案 0 :(得分:1)

Statics和EF是混乱的秘诀。在asp.net下,1个应用程序池,很多线程。如果必须但不是上下文,则存储静态。因此,请始终确保每个线程都有自己的上下文。

但是考虑到你的问题,我会使用一个简单的现成解决方案 在应该具有缓存值的thr控制器中。在GET方法上 您可以在特定时间段内按ID进行缓存... 值得一试。让IIS,ASP.NET为您工作。 : - )

 [OutputCache(Duration = int.MaxValue, VaryByParam = "id", Location = OutputCacheLocation.ServerAndClient)]
    public ActionResult Get(string id) {
        // the value that can be cached is collected with a NEW CONTEXT !

答案 1 :(得分:1)

我们还使用后台线程来检查电子邮件,并在我们的一个较大的MVC应用程序中经常进行清理。只要你在后台线程上创建一个新的上下文(并处理它)而不是尝试使用主应用程序线程中的那个,你就可以了。 DbContext不是线程安全的,这意味着您无法安全地在多个线程之间共享它。这并不意味着您不能拥有多个线程,每个线程都有自己的db上下文副本。唯一需要注意的是并发问题(尝试同时更新一行)。