我应该将DbContext的实例保存在执行定期作业的单独线程中

Omu*_*Omu 3 .net c# asp.net multithreading entity-framework-4

我有一个定期发送电子邮件的类Worker,我从App_start()上的Global.asax.cs开始

public static class Worker
{
    public static void Start()
    {
        ThreadPool.QueueUserWorkItem(o => Work());
    }

    public static void Work()
    {
        var r = new DbContext();
        var m = new MailSender(new SmtpServerConfig());
        while (true)
        {
            Thread.Sleep(600000);
            try
            {
                var d = DateTime.Now.AddMinutes(-10);
                var ns = r.Set<Notification>().Where(o => o.SendEmail && !o.IsRead && o.Date < d);

                foreach (var n in ns)
                {
                    m.SendEmailAsync("noreply@example.com", n.Email, NotifyMailTitle(n) + " - forums", NotifyMailBody(n));
                    n.SendEmail = false;
                }

                r.SaveChanges();
            }
            catch (Exception ex)
            {
                ex.Raize();
            }
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

所以我保持这个dbcontext活着的整个生命周期应用程序是一个很好的做法?

Muh*_*han 5

DbContext是一个非常轻量级的对象.

您的DbContext是否保持活动状态或者在调用之前实例化它并不重要,因为实际的数据库连接仅在您提交更改或枚举查询时打开(在这种情况下,它在枚举结束时关闭).

在你的具体情况下.这完全没关系.

有关详细信息,请阅读Linq DataContext和Dispose.