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

questionAnswers(1)

yourAnswerToTheQuestion