ASP.NET MVC: visualização de renderização de exceção no novo segmento
Eu quero criar um processo no meu aplicativo asp.net que eu acionar manualmente e enviar um monte de e-mails para os meus usuários. Como esse processo leva algum tempo, estou criando um novo thread para enviar essas mensagens e evitar o tempo limite no meu aplicativo da web. (Eu sei que isso é propenso a erros caso o pool de aplicativos seja reciclado ou haja uma exceção não tratada no aplicativo, mas esse é outro assunto).
Por isso estou fazendo algo assim:
public ActionResult SendMessages()
{
Task.Factory.StartNew(() => { SendMessagesLongRunningProcess(); });
return View();
}
dentro do processo de execução demorado, estou tentando renderizar a exibição para o email em HTML e enviá-lo. Como isso:
private void SendMessagesLongRunningProcess()
{
var users = GetUsers();
foreach (var user in users)
{
string message = RenderView("EmailMessage", user);
SendEmail(user.email, message);
}
}
Agora, eu sei que o meu método RenderView funciona muito bem desde que eu usá-lo para renderizar e-mails em outros lugares. O problema é quando tento executá-lo em um novo thread, como estou fazendo aqui. Este é o meu método 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();
}
}
O erro que estou recebendo é:
Value does not fall within the expected range.
Quando o método viewResult.View.Render é chamado.
Eu estou supondo que isso tem a ver com o fato de que o contexto do controlador não é mais válido no novo segmento, mas não tenho certeza.
Então, qual é a melhor maneira de abordar isso? Quais alternativas eu tenho?
obrigado