在ASP.NET ActionResult中执行Task.Run()而不等待结果

时间:2018-06-06 11:14:16

标签: c# asp.net-mvc task

下面是我尝试在后台执行一个函数然后继续而不等待它的结果的函数。

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

可能是什么问题,因为在此之后没有产生错误以表明其他情况?

这是在页面加载。

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);
            }
        }
    }

0 个答案:

没有答案