C#async等待来自Controller

时间:2014-01-23 17:47:19

标签: c# asp.net asp.net-mvc asynchronous

我有一个ASP.Net MVC控制器,它调用一个发布采购订单的方法。但是我希望采购订单发布在后台进行,我不希望控制器在返回之前等待采购订单发布。发布需要很长时间,如果出现错误,网站用户确实无法做任何事情,还需要提醒其他人。

使用C#await和async功能似乎是个好例子,但我很难让它运行起来。我尝试设置将采购订单作为异步方法过帐的方法。但是我遇到了以下问题:

  • 具有发布采购订单的方法的类实现接口。控制器正在使用该接口,您无法在接口中的方法上放置异步。所以我尝试通过让方法返回一个Task来解决这个问题。
  • 发布采购订单的方法不是异步运行,而是像普通方法一样同步运行。

我做错了什么?这是代码:

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.
    }
}

2 个答案:

答案 0 :(得分:3)

我在博客上解释async doesn't change the HTTP protocol。使控制器操作async不会导致响应提前发送。

要正确执行此操作,请将请求保存到持久队列(例如,Azure队列或MSMQ),并具有执行处理和失败通知的独立后端(例如,Azure辅助角色或Win32服务)。

答案 1 :(得分:0)

你使这比它需要的更复杂。如果你只是想解雇另一个线程为你做一些工作而不用担心,你需要做的就是列出这个:

public ActionResult PostPO(string shipmentid)
    {
        Task.Run(() => PostPOAsync(shipmentid));
        Return view();
    }