Я создаю веб-сайт ASP.NET MVC 5, где у меня есть одна операция, для которой требуется много времени для выполнения (импорт электронной почты из обмена с EWS2.0 управляемый API). Проблема заключается в том, что клиент запускает метод действия импорта, весь сайт блокируется, и никто не может открыть/Home/Index, например, или не может выполнить какой-либо запрос на сервер после того, как исключение будет выбрано (Timeout), если никто Взаимодействие с сайтом во время процесса импорта - импорт успешно, иначе он не гарантируется из-за исключения таймаута. Как я могу запустить импорт, а затем перенаправить пользователей в/home/index и продолжить импорт на стороне сервера ..? Вот что я пробовал:C#: Неблокирующие методы действий в ASP.NET MVC
public ActionResult Exchange(DateTime? id)
{
string url = ....;
try
{
ExchangeToDatabase etd = new ExchangeToDatabase(username, password, domain, url, id);
etd.ExportFromExchange();
}
catch (InvalidDateException ex)
{
return RedirectToAction("Display", "Error", new { returnUrl = "/", Message = ex.Message });
}
Пробовал нитями также:
/*System.Threading.Tasks.Task.Factory.StartNew(() =>
{
ExchangeToDatabase etd = new ExchangeToDatabase("cbstest", "[email protected]", "vlaeynatie", url, id);
etd.ExportFromExchange();
});
или: не работает ..
new Thread(() =>
{
ExchangeToDatabase etd = new ExchangeToDatabase("cbstest", "[email protected]", "vlaeynatie", url, id);
etd.ExportFromExchange();
}).Start();*/
return Redirect("/");
}
Вы слышали о 'контроллерах async' ?? –
Я забыл упомянуть, что это тоже не помогло .. или, может быть, я пропустил их использование. Etd.ExportFromExchange() имеет тип возврата void .. но во всех примерах контроллера асинхронного использования они используют какой-то асинхронный возврат результат .., но мне нечего возвращать клиентам. Просто хочу закончить импорт, не нужно сообщать об этом, клиенты уже знают это. –
Хотите, чтобы вы начали импорт и перенаправляли пользователя в/Home/Index сразу? Правильно ли это? –