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.

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

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

Спасибо

9
задан willvv 16 August 2012 в 22:14
поделиться