ASP.NET MVC: представление рендеринга исключений в новом потоке
Я хочу создать в моем приложении ASP.NET процесс, который я запускаю вручную и отправлю кучу электронных писем своим пользователям. Поскольку этот процесс занимает некоторое время, я создаю новую ветку для отправки этих сообщений и предотвращения таймаутов в моем веб-приложении. (Я знаю, что это подвержено ошибкам в случае повторного использования пула приложений или в случае необработанного исключения в приложении, но это другая тема).
Для этого я делаю что-то вроде этого:
public ActionResult SendMessages()
{
Task.Factory.StartNew(() => { SendMessagesLongRunningProcess(); });
return View();
}
внутри длительного процесса я пытаюсь отобразить представление электронной почты в формате HTML и отправить его. Как это:
private void SendMessagesLongRunningProcess()
{
var users = GetUsers();
foreach (var user in users)
{
string message = RenderView("EmailMessage", user);
SendEmail(user.email, message);
}
}
Теперь я знаю, что мой метод RenderView работает просто отлично, поскольку я использую его для визуализации представлений электронной почты в других местах. Проблема в том, что когда я пытаюсь выполнить его в новом потоке, как я делаю здесь. Это мой метод RenderView:
public string RenderView(string viewName, object model)
{
ViewData.Model = model;
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName, null);
var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
Я получаю ошибку:
Value does not fall within the expected range.
Когда вызывается метод viewResult.View.Render.
Я предполагаю, что это связано с тем фактом, что контекст контроллера больше не действителен в новом потоке, но я не уверен.
Итак, как лучше всего подойти к этому? Какие у меня есть альтернативы?
Спасибо