C# 在ASP.NETMVC中创建异步报表

C# 在ASP.NETMVC中创建异步报表,c#,asp.net,asp.net-mvc,asynchronous,C#,Asp.net,Asp.net Mvc,Asynchronous,我有一个ASP.NETMVCWeb应用程序,用户应该能够在其中创建Excel报告。创建某些报告大约需要15分钟。因此,我希望异步创建这些Excel文件,并在准备好后通过电子邮件发送它们 一旦用户发布了表单并请求创建Excel文件,用户应该会得到一个回答,上面写着“附有Excel文件的邮件将在大约15分钟内发送给您。” 您是如何做到这一点的?这是一个有点宽泛的问题,但是对于.NET4中良好的线程,您可以使用它 您可以在控制器中创建普通操作: [HttpPost] public ActionResu

我有一个ASP.NETMVCWeb应用程序,用户应该能够在其中创建Excel报告。创建某些报告大约需要15分钟。因此,我希望异步创建这些Excel文件,并在准备好后通过电子邮件发送它们

一旦用户发布了表单并请求创建Excel文件,用户应该会得到一个回答,上面写着“附有Excel文件的邮件将在大约15分钟内发送给您。”


您是如何做到这一点的?

这是一个有点宽泛的问题,但是对于.NET4中良好的线程,您可以使用它

您可以在控制器中创建普通操作:

[HttpPost]
public ActionResult ExcelReport(ReportModel model)
{
    if(ModelState.IsValid)
    {
        ReportService reportCreator = new ReportService(); // or whatever class you use for that
        Task.Factory.StartNew( () => reportCreator.GenerateReport(model)); 
        //redirect somewhere or return a plain view with your message
        return View("ConfirmationMessage");
    }
    return View();
}
当然,您必须在GenerateReport中的生成结束时发送它,或者更深入地从GenerateReport方法触发另一个任务


这是在服务器端完成的,如果您想要弹出窗口,您必须使用jQuery拦截表单提交,将模型传递给您选择的函数,在该函数中启动任务,并使用jQueryUI弹出的消息。但这是偏好的问题。:)

ASP.NET中后台工作的问题是ASP.NET可以随时销毁AppDomain并创建一个新的AppDomain(回收)。如果您在运行时不知道的线程上运行工作,它们也将被销毁

通常的解决方案是使用一个单独的Windows服务进程来负责后台工作。因为这是一个不同的进程,所以它不受ASP.NET的控制


因此,在web响应完成之前,您的web应用程序会向服务发布一个执行某些工作的请求。此通信通常使用服务中托管的WCF进行。

谢谢!我现在使用了Task.Factory.StartNew(…),只要AppDomain没有被破坏,它就可以工作。当我有更多的时间时,我将尝试使用WCF服务以正确的方式实现它。