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.

Я предполагаю, что это связано с тем фактом, что контекст контроллера больше не действителен в новом потоке, но я не уверен.

Итак, как лучше всего подойти к этому? Какие у меня есть альтернативы?

Спасибо

Ответы на вопрос(1)

Ваш ответ на вопрос