Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#异步等待来自控制器_C#_Asp.net_Asp.net Mvc_Asynchronous - Fatal编程技术网

C#异步等待来自控制器

C#异步等待来自控制器,c#,asp.net,asp.net-mvc,asynchronous,C#,Asp.net,Asp.net Mvc,Asynchronous,我有一个ASP.NETMVC控制器,它调用一个将发布采购订单的方法。但是,我希望采购订单过账发生在后台,我不希望控制器在返回之前等待采购订单过账。发帖需要很长时间,如果出现错误,网站用户真的无能为力,需要提醒其他人 这似乎是使用C#wait和异步功能的一个很好的例子,但我正在努力让它工作。我尝试将发布采购订单的方法设置为异步方法。但是,我遇到了以下问题: 具有发布采购订单的方法的类实现了一个接口。控制器正在使用接口,您不能在接口中的方法上放置async。所以我试图通过让方法返回一个任务来解决这

我有一个ASP.NETMVC控制器,它调用一个将发布采购订单的方法。但是,我希望采购订单过账发生在后台,我不希望控制器在返回之前等待采购订单过账。发帖需要很长时间,如果出现错误,网站用户真的无能为力,需要提醒其他人

这似乎是使用C#wait和异步功能的一个很好的例子,但我正在努力让它工作。我尝试将发布采购订单的方法设置为异步方法。但是,我遇到了以下问题:

  • 具有发布采购订单的方法的类实现了一个接口。控制器正在使用接口,您不能在接口中的方法上放置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服务。我确实需要确保方法完成并且不会被杀死。我将采取不同的方法。谢谢你的帮助。