在MVC4中处理电子邮件异步

时间:2013-08-22 11:01:24

标签: multithreading email asp.net-mvc-4

我正在尝试对我的MVC4网站进行检查,看看是否应该通过电子邮件提醒用户,因为他们没有做过什么。

我很难弄清楚如何处理这个问题。我检查了共享主机平台是否允许我激活某种cronjob,但这不可用。

所以现在我的想法是对每个页面请求执行此检查,这已经看起来不是最理想的(因为开销)。但我认为使用异步不会妨碍人们访问网站。

我首先尝试在Global.asax的Application_BeginRequest方法中执行此操作,但是每次页面请求会多次调用它,因此无效。

接下来我发现我可以创建一个在OnResultExecuted上执行的全局过滤器,这似乎很有希望,但它仍然没有用。

我遇到的问题是我使用MVCMailer发送邮件,当我执行它时,我收到错误:{“Value不能为null。\ r \ nParameter name:httpContext”} 这可能意味着邮件程序需要上下文。

我现在在全局过滤器中的代码如下:

public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        base.OnResultExecuted(filterContext);
        HandleEmptyProfileAlerts();

    }
    private void HandleEmptyProfileAlerts()
    {
        new Thread(() =>
        {
            bool active = false;
            new UserMailer().AlertFirst("bla@bla.com").Send();
            DB db = new DB();
            DateTime CutoffDate = DateTime.Now.AddDays(-5);
            var ProfilesToAlert = db.UserProfiles.Where(x => x.CreatedOn < CutoffDate && !x.ProfileActive && x.AlertsSent.Where(y => y.AlertType == "First").Count() == 0).ToList();
            foreach (UserProfile up in ProfilesToAlert)
            {
                if (active)
                {
                    new UserMailer().AlertFirst(up.UserName).Send();
                    up.AlertsSent.Add(new UserAlert { AlertType = "First", DateSent = DateTime.Now, UserProfileID = up.UserId });
                }
                else
                    System.Diagnostics.Debug.WriteLine(up.UserName);
            }
            db.SaveChanges();

        }).Start();
    }

所以我的问题是,我是否采用正确的方法,如果是这样,我怎样才能确保MVCMailer获得正确的背景?

1 个答案:

答案 0 :(得分:0)

执行此类操作的常用方法是使用单个后台线程定期执行您感兴趣的检查。

您可以从Application_Start()启动该线程。使用数据库来排队和存储工作项是很常见的,但如果它对你的应用程序更好,它也可以在内存中完成。