Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在MVC4中异步处理电子邮件列表_Multithreading_Email_Asp.net Mvc 4 - Fatal编程技术网

Multithreading 在MVC4中异步处理电子邮件列表

Multithreading 在MVC4中异步处理电子邮件列表,multithreading,email,asp.net-mvc-4,Multithreading,Email,Asp.net Mvc 4,我正试图让我的MVC4网站检查,看看人们是否应该收到电子邮件提醒,因为他们没有做什么 我很难弄清楚如何处理这个问题。我检查了共享托管平台是否允许我激活某种cronjob,但这不可用 因此,现在我的想法是对每个页面请求执行此检查,由于开销的原因,这似乎是次优的。但我认为使用异步不会妨碍人们访问网站 我首先尝试在Global.asax中的应用程序_BeginRequest方法中执行此操作,但随后它会在每个页面请求中被调用多次,因此无法正常工作 接下来,我发现我可以制作一个在OnResultExecu

我正试图让我的MVC4网站检查,看看人们是否应该收到电子邮件提醒,因为他们没有做什么

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

因此,现在我的想法是对每个页面请求执行此检查,由于开销的原因,这似乎是次优的。但我认为使用异步不会妨碍人们访问网站

我首先尝试在Global.asax中的应用程序_BeginRequest方法中执行此操作,但随后它会在每个页面请求中被调用多次,因此无法正常工作

接下来,我发现我可以制作一个在OnResultExecuted上执行的全局过滤器,这看起来很有希望,但仍然不可行

我遇到的问题是,我正在使用MVCMailer发送邮件,当我执行它时,我得到错误:{值不能为null。\r\n参数名称:httpContext} 这可能意味着mailer需要上下文

我现在在全局筛选器中的代码如下所示:

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获得正确的上下文?

通常的方法是使用一个后台线程定期执行您感兴趣的检查

您可以从应用程序启动线程。使用数据库来排队和存储工作项是很常见的,不过如果对应用程序更有利的话,也可以在内存中完成