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
,您看不到这一点吗?现在不会触发并忘记,因此您可以直接内联运行代码并丢弃任务。运行