我有一个ASP.Net MVC控制器,它调用一个发布采购订单的方法。但是我希望采购订单发布在后台进行,我不希望控制器在返回之前等待采购订单发布。发布需要很长时间,如果出现错误,网站用户确实无法做任何事情,还需要提醒其他人。
使用C#await和async功能似乎是个好例子,但我很难让它运行起来。我尝试设置将采购订单作为异步方法过帐的方法。但是我遇到了以下问题:
我做错了什么?这是代码:
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.
}
}
答案 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();
}