ASP.NET MVC: widok renderowania wyjątków w nowym wątku
Chcę utworzyć proces w mojej aplikacji ASP.NET, który wyzwalam ręcznie i wyśle kilka wiadomości e-mail do moich użytkowników. Ponieważ ten proces zajmuje trochę czasu, tworzę nowy wątek, aby wysyłać te wiadomości i zapobiegać przekroczeniu limitu czasu w mojej aplikacji internetowej. (Wiem, że jest to podatne na błędy w przypadku recyklingu puli aplikacji lub nieobsługiwanego wyjątku w aplikacji, ale to inny temat).
W tym celu robię coś takiego:
public ActionResult SendMessages()
{
Task.Factory.StartNew(() => { SendMessagesLongRunningProcess(); });
return View();
}
wewnątrz długiego procesu próbuję wyświetlić widok dla wiadomości e-mail HTML i wysłać go. Lubię to:
private void SendMessagesLongRunningProcess()
{
var users = GetUsers();
foreach (var user in users)
{
string message = RenderView("EmailMessage", user);
SendEmail(user.email, message);
}
}
Teraz wiem, że moja metoda RenderView działa dobrze, ponieważ używam jej do renderowania widoków e-mail w innych miejscach. Problem polega na tym, że próbuję go wykonać w nowym wątku, tak jak tutaj. To jest moja metoda 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();
}
}
Błąd, który dostaję to:
Value does not fall within the expected range.
Po wywołaniu metody viewResult.View.Render.
Zgaduję, że ma to związek z faktem, że kontekst kontrolera nie jest już ważny w nowym wątku, ale nie jestem pewien.
Jaki jest najlepszy sposób na to? Jakie mam alternatywy?
Dzięki