Я хочу создать процесс в своем приложении 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.
Я предполагаю, что это связано с тем, что контекст контроллера больше недействителен в новом потоке, но я не уверен.
Итак, как лучше всего подойти к этому? Какие у меня есть альтернативы?
Спасибо