C# 在ASP.NET ActionResult中执行Task.Run(),无需等待结果

C# 在ASP.NET ActionResult中执行Task.Run(),无需等待结果,c#,asp.net-mvc,task,C#,Asp.net Mvc,Task,下面是一个函数,我试图在后台执行一个函数,然后在不等待结果的情况下继续执行 调试时,任务本身被执行,但其中的实际功能没有执行。然后,代码的其余部分继续正常运行 如果此后没有产生错误,则会出现什么问题 这是一个页面加载 public ActionResult ExceptionReport(int? id) { var ExceptionList = db.Invoices.Where(m => m.ExceptionFlag == true && m.GlobalI

下面是一个函数,我试图在后台执行一个函数,然后在不等待结果的情况下继续执行

调试时,任务本身被执行,但其中的实际功能没有执行。然后,代码的其余部分继续正常运行

如果此后没有产生错误,则会出现什么问题

这是一个页面加载

public ActionResult ExceptionReport(int? id)
{
    var ExceptionList = db.Invoices.Where(m => m.ExceptionFlag == true && m.GlobalInvoiceID == id);

    if (ExceptionList.Count() == 0)
    {

        globalInvoice.Status = "Exception Verification";
        db.Entry(globalInvoice).State = EntityState.Modified;
        db.SaveChanges();

        Task.Run(() => ExceptionFinalTests(globalInvoice)); //Function To run in the background



        TempData["warning"] = "Verifying all exceptions fixed. A notification will be sent when the verifications are complete.";
        return RedirectToAction("Index", "GlobalInvoices");
    }

    return View(ExceptionList);
}


   private void ExceptionFinalTests(GlobalInvoice globalInvoice)
    {
        RunTests(globalInvoice, true);

        decimal TotalPaymentAmount = db.Invoices.Where(m => m.GlobalInvoiceID == globalInvoice.Id).Sum(m => m.Invoice_Amount) ?? 0;
        }

        GlobalInvoicesController globalInvoicesController = new GlobalInvoicesController();

        var ApproverList = globalInvoicesController.GetUserEmailsInRole(globalInvoice, "Reviewer");

        globalInvoicesController.Dispose();

        var exceptionExistCompulsoryTest = db.Invoices.Where(m => m.ExceptionFlag == true && m.GlobalInvoiceID == globalInvoice.Id);

        if (exceptionExistCompulsoryTest.Count() > 0)
        {
            try
            {
                string baseUrl = ConfigurationManager.AppSettings["site"];

                EmailExtension emailExtension = new EmailExtension();

                foreach (var approver in ApproverList)
                {
                    string approvalLink = baseUrl + "/Invoices/ExceptionReport/" + globalInvoice.Id;

                    StringBuilder mailbody = new StringBuilder();
                    mailbody.AppendFormat("Hi<br/>");
                    mailbody.AppendFormat("There are " + exceptionExistCompulsoryTest.Count() + " exceptions for invoice #" + globalInvoice.Id + "that need attention before proceeding. - <a href='" + approvalLink + "'>Click Here</a> <br/><br/>");

                    mailbody.AppendFormat("Exception Count: {0}<br/>", exceptionExistCompulsoryTest.Count());
                    mailbody.AppendFormat("Invoice Amount: {0}<br/>", TotalPaymentAmount.ToString("C"));
                    mailbody.AppendFormat("Reviewed By: {0} <br/>", "");
                    mailbody.AppendFormat("Approved By: {0} <br/>", "");

                    EmailVM emailVM = new EmailVM()
                    {
                        Subject = "Invoice - #" + globalInvoice.Id,
                        EmailAddress = approver,
                        Message = mailbody.ToString()
                    };

                    emailExtension.SendEmail(emailVM);
                }
            }
            catch (Exception ex)
            {
                LogWriter.WriteLog(ex.Message);
                LogWriter.WriteLog(ex.StackTrace);
            }
        }
    }


    private void RunTests(GlobalInvoice globalInvoice, bool retestFlag = false)
    {

        List<Invoice> invoices;
        var vendorTests = globalInvoice.Vendor.VendorTests;
        string[] testsToRun = vendorTests.Split(',');

        if (retestFlag == true)
        {
            if (globalInvoice.Vendor.VendorHasHierarchy == true)
            {
                testsToRun = new string[] { "Account Number", "Hierarchy" };
            }
            else
            {
                testsToRun = new string[] { "Account Number" };
            }
        }

            using (var context = new MyContext())
            {
                invoices = context.Invoices.Where(m => m.GlobalInvoiceID == globalInvoiceToTestID).ToList();
            }


        foreach (var test in testsToRun)
        {
            if (test == "Account Number")
            {
                LogWriter.WriteLog("Starting Account Number Check : Invoice Batch ID - " + globalInvoice.Id);
                AccountNumberCheck(invoices, globalInvoice.VendorID);
                LogWriter.WriteLog("Account Number Check Complete : Invoice Batch ID - " + globalInvoice.Id);
            }
            if (test == "Hierarchy")
            {
                LogWriter.WriteLog("Starting Hierarchy Check : Invoice Batch ID - " + globalInvoice.Id);
                BillingHierarchyCheck(invoices);
                LogWriter.WriteLog("Hierarchy Check Complete : Invoice Batch ID - " + globalInvoice.Id);
            }
        }
    }
公共行动结果例外报告(int?id) { var ExceptionList=db.Invoices.Where(m=>m.ExceptionFlag==true&&m.GlobalInvoiceID==id); if(ExceptionList.Count()==0) { globalInvoice.Status=“异常验证”; db.Entry(globalInvoice).State=EntityState.Modified; db.SaveChanges(); Task.Run(()=>ExceptionFinalTests(globalInvoice));//要在后台运行的函数 TempData[“warning”]=“验证所有异常已修复。验证完成后将发送通知。”; 返回重定向到操作(“索引”、“全球语音”); } 返回视图(例外列表); } 私有无效例外验证测试(GlobalInvoice GlobalInvoice) { 运行测试(globalInvoice,真); 十进制TotalPaymentAmount=db.Invoices.Where(m=>m.GlobalInvoiceID==globalInvoice.Id)。总和(m=>m.Invoices\u金额)??0; } GlobalInvoicesController GlobalInvoicesController=新的GlobalInvoicesController(); var ApproverList=globalInvoicesController.GetUserEmailsInRole(globalInvoice,“审阅者”); globalInvoicesController.Dispose(); var exceptionExistCompulsoryTest=db.Invoices.Where(m=>m.ExceptionFlag==true&&m.GlobalInvoiceID==globalInvoice.Id); 如果(ExceptionExisterForulsoryTest.Count()>0) { 尝试 { 字符串baseUrl=ConfigurationManager.AppSettings[“站点”]; EmailExtension EmailExtension=新的EmailExtension(); foreach(审批人列表中的var审批人) { 字符串approvalLink=baseUrl+“/Invoices/ExceptionReport/”+globalInvoice.Id; StringBuilder邮件体=新建StringBuilder(); mailbody.AppendFormat(“Hi
”); mailbody.AppendFormat(“发票#“+globalInvoice.Id+”存在“+ExceptionExistsCompulsoryTest.Count()+”异常,在继续之前需要注意。-

”; AppendFormat(“异常计数:{0}
”,ExceptionExist强制测试.Count()); mailbody.AppendFormat(“发票金额:{0}
”,TotalPaymentAmount.ToString(“C”); AppendFormat(“审阅者:{0}
”,和“”); AppendFormat(“批准人:{0}
,”); EmailVM EmailVM=新的EmailVM() { Subject=“发票-#”+globalInvoice.Id, EmailAddress=批准人, Message=mailbody.ToString() }; emailExtension.SendEmail(emailVM); } } 捕获(例外情况除外) { LogWriter.WriteLog(例如消息); LogWriter.WriteLog(例如StackTrace); } } } 专用void运行测试(GlobalInvoice GlobalInvoice,bool resetflag=false) { 列出发票; var vendorTests=globalInvoice.vendorTests.vendorTests; 字符串[]testsToRun=vendorTests.Split(','); 如果(retestFlag==真) { if(globalInvoice.Vendor.VendorHasHierarchy==true) { testsToRun=新字符串[]{“帐号”,“层次结构”}; } 其他的 { testsToRun=新字符串[]{“帐号”}; } } 使用(var context=new MyContext()) { invoices=context.invoices.Where(m=>m.GlobalInvoiceID==globalInvoiceToTestID.ToList(); } foreach(testsToRun中的var测试) { 如果(测试==“账号”) { LogWriter.WriteLog(“开始账号检查:发票批次ID-”+globalInvoice.ID); AccountNumberCheck(发票,globalInvoice.VendorID); LogWriter.WriteLog(“账号检查完成:发票批次ID-”+globalInvoice.ID); } 如果(测试==“层次结构”) { LogWriter.WriteLog(“启动层次结构检查:发票批次ID-”+globalInvoice.ID); BillingHierarchyCheck(发票); LogWriter.WriteLog(“层次结构检查完成:发票批次ID-”+globalInvoice.ID); } } }
例外验证测试的作用是什么?在修改该方法之前,如果您想让操作执行任务,请考虑使用公共异步动作异常报告(INT.ID)。我还将检查id的值,您需要在LINQ语句中使用id.value。如果你有其他任务需要运行,我会把它们放在Gualal.Axax中,并考虑静态方法,这样你就可以在以后检查进度,如果有必要的话,ToKeNSI已经改变了代码,先对GoalalCub进行修改,然后运行任务。我还添加了上面的其他相关函数,您可以看到我正在尝试做什么。ExceptionFinalTests将在绑定到globalInvoice的“发票”上运行测试,并根据异常向需要的人发送电子邮件。调试异步操作总是有点棘手,因为它们是异步运行的。通过添加
Sleep
,您看不到这一点吗?现在不会触发并忘记,因此您可以直接内联运行代码并丢弃
任务。运行