Multithreading 在MVC4中异步处理电子邮件列表
我正试图让我的MVC4网站检查,看看人们是否应该收到电子邮件提醒,因为他们没有做什么 我很难弄清楚如何处理这个问题。我检查了共享托管平台是否允许我激活某种cronjob,但这不可用 因此,现在我的想法是对每个页面请求执行此检查,由于开销的原因,这似乎是次优的。但我认为使用异步不会妨碍人们访问网站 我首先尝试在Global.asax中的应用程序_BeginRequest方法中执行此操作,但随后它会在每个页面请求中被调用多次,因此无法正常工作 接下来,我发现我可以制作一个在OnResultExecuted上执行的全局过滤器,这看起来很有希望,但仍然不可行 我遇到的问题是,我正在使用MVCMailer发送邮件,当我执行它时,我得到错误:{值不能为null。\r\n参数名称:httpContext} 这可能意味着mailer需要上下文 我现在在全局筛选器中的代码如下所示:Multithreading 在MVC4中异步处理电子邮件列表,multithreading,email,asp.net-mvc-4,Multithreading,Email,Asp.net Mvc 4,我正试图让我的MVC4网站检查,看看人们是否应该收到电子邮件提醒,因为他们没有做什么 我很难弄清楚如何处理这个问题。我检查了共享托管平台是否允许我激活某种cronjob,但这不可用 因此,现在我的想法是对每个页面请求执行此检查,由于开销的原因,这似乎是次优的。但我认为使用异步不会妨碍人们访问网站 我首先尝试在Global.asax中的应用程序_BeginRequest方法中执行此操作,但随后它会在每个页面请求中被调用多次,因此无法正常工作 接下来,我发现我可以制作一个在OnResultExecu
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获得正确的上下文?通常的方法是使用一个后台线程定期执行您感兴趣的检查 您可以从应用程序启动线程。使用数据库来排队和存储工作项是很常见的,不过如果对应用程序更有利的话,也可以在内存中完成