2015-03-04 4 views
0

Я создаю веб-сайт 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("/"); 
    } 
+2

Вы слышали о 'контроллерах async' ?? –

+0

Я забыл упомянуть, что это тоже не помогло .. или, может быть, я пропустил их использование. Etd.ExportFromExchange() имеет тип возврата void .. но во всех примерах контроллера асинхронного использования они используют какой-то асинхронный возврат результат .., но мне нечего возвращать клиентам. Просто хочу закончить импорт, не нужно сообщать об этом, клиенты уже знают это. –

+0

Хотите, чтобы вы начали импорт и перенаправляли пользователя в/Home/Index сразу? Правильно ли это? –

ответ

2

После нескольких дней исследований и попыток предотвратить блокирование пользовательского интерфейса я нашел ответ: сделайте сеанс пользователя readonly. Ответ от @SamStephens в this post дал мне результат, который я хочу. Вот оно:

[SessionState(SessionStateBehavior.ReadOnly)] 
+0

, это помогло мне в другой проблеме, но я думаю, что в вашем случае вы должны смотреть на что-то вроде сигнала R, – CMS

2

Я сделал это недавно для проекта, и я использовал Task.Run()

Task.Run(() => SomeMethod(someVariable)); 
+0

Получаю от Intellisense: асинхронному методу не хватает операторов «ждут» и будет работать синхронно. Подумайте, используя оператор «ожидание», чтобы ждать неблокирующих вызовов API или «ждать Task.Run (...)», чтобы выполнять работу с привязкой к процессору в фоновом потоке. –

+0

@ M.Veli с асинхронным определением метода вы должны использовать ожидание при вызове метода, который занимает время –

+0

@M.Veli Apologies, именно там я скопировал свой код, который вызывает методы async – ediblecode

Смежные вопросы