2014-01-23 2 views
1

У меня есть ASP.Net MVC-контроллер, и он вызывает метод, который отправит заказ на покупку. Однако я хочу, чтобы проводка заказа на поставку происходила в фоновом режиме, я не хочу, чтобы контроллер дождался отправки заказа на поставку перед возвратом. Публикация занимает много времени, и действительно нет ничего, что может сделать пользователь веб-сайта, если есть ошибка, кто-то еще должен быть предупрежден.C# async ждут от контроллера

Это казалось хорошим случаем для использования функции ожидания C# и асинхронности, но я изо всех сил стараюсь заставить ее работать. Я попытался настроить метод, который размещает заказ на поставку как асинхронный метод. Однако я столкнулся с следующими проблемами:

  • Класс, который имеет метод, который публикует заказ на поставку, реализует интерфейс. Контроллер использует интерфейс, и вы не можете поместить асинхронный метод в интерфейс. Поэтому я попытался разрешить это, вернув метод в задачу.
  • Метод отправки заказа на поставку не выполняется асинхронно, он работает синхронно, как обычный метод.

Что я делаю неправильно? Вот код:

public class POReceivingController : Controller 
{ 
    IPOReceivingService poservice; 

    public POReceivingController(IPOReceivingService poserviceparm) 
    { 
     poservice = poserviceparm; 
    } 

    public ActionResult PostPO(string shipmentid) 
    { 
     poservice.PostPOAsync(shipmentid); 
    } 
} 

public interface IPOReceivingService 
{ 
    Task PostPOAsync(string shipmentidparm); 
} 

public class POReceivingService : IPOReceivingService 
{ 
    public async Task PostPOAsync(string shipmentidparm) 
    { 
     // Code to post PO and alert correct people if there is an error. 
    } 
} 
+1

http://stackoverflow.com/a/18509424 –

+0

Ссылка при условии от @RobertHarvey есть объяснение, почему вы не должны делать методы «огонь и забыть» ... Если у вас действительно есть длительные операции, вы должны рассмотреть некоторую дополнительную систему, которая будет выполнять операции и позволить пользователю отслеживать прогресс/завершение отдельно. –

+0

Как служба Windows. –

ответ

3

Как я расскажу в своем блоге, async doesn't change the HTTP protocol. Выполнение действия контроллера async не приведет к отправке ответа на раннее.

Для этого необходимо сохранить запрос в постоянную очередь (например, Azure queue или MSMQ) и иметь независимый сервер (например, роль рабочего агента Azure или службу Win32), которая выполняет обработку и отказ notificaiton.

0

Вы делаете это более сложным, чем это должно быть. Если вы просто хотите, чтобы выстрелить еще один поток, чтобы сделать некоторую работу для вас и не беспокоиться обо всем, что нужно сделать ней список что-то это:

public ActionResult PostPO(string shipmentid) 
    { 
     Task.Run(() => PostPOAsync(shipmentid)); 
     Return view(); 
    } 
Смежные вопросы