C#异步等待来自控制器
我有一个ASP.NETMVC控制器,它调用一个将发布采购订单的方法。但是,我希望采购订单过账发生在后台,我不希望控制器在返回之前等待采购订单过账。发帖需要很长时间,如果出现错误,网站用户真的无能为力,需要提醒其他人 这似乎是使用C#wait和异步功能的一个很好的例子,但我正在努力让它工作。我尝试将发布采购订单的方法设置为异步方法。但是,我遇到了以下问题:C#异步等待来自控制器,c#,asp.net,asp.net-mvc,asynchronous,C#,Asp.net,Asp.net Mvc,Asynchronous,我有一个ASP.NETMVC控制器,它调用一个将发布采购订单的方法。但是,我希望采购订单过账发生在后台,我不希望控制器在返回之前等待采购订单过账。发帖需要很长时间,如果出现错误,网站用户真的无能为力,需要提醒其他人 这似乎是使用C#wait和异步功能的一个很好的例子,但我正在努力让它工作。我尝试将发布采购订单的方法设置为异步方法。但是,我遇到了以下问题: 具有发布采购订单的方法的类实现了一个接口。控制器正在使用接口,您不能在接口中的方法上放置async。所以我试图通过让方法返回一个任务来解决这
- 具有发布采购订单的方法的类实现了一个接口。控制器正在使用接口,您不能在接口中的方法上放置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.
}
}
正如我在博客上解释的那样。使控制器动作异步
不会导致响应提前发送
要正确执行此操作,请将请求保存到一个持久队列(例如Azure队列或MSMQ),并使用一个独立的后端(例如Azure worker角色或Win32服务)来执行处理和故障通知。您正在使其变得比需要的更复杂。如果您只想启动另一个线程为您做一些工作,而不必担心,那么您需要做的就是列出以下事项:
public ActionResult PostPO(string shipmentid)
{
Task.Run(() => PostPOAsync(shipmentid));
Return view();
}
@RobertHarvey提供的链接解释了为什么您不应该使用“开火并忘记”方法。。。如果您确实有长时间运行的操作,您应该考虑一些额外的系统,这些系统将执行操作,并让用户单独跟踪进度/完成。就像Windows服务。我确实需要确保方法完成并且不会被杀死。我将采取不同的方法。谢谢你的帮助。