我已经将动作包裹在Task.Run
中,但似乎我遗漏了一些非常基本的东西。但无法弄清楚。
public void SaveOrderList(List<Order> inputList)
{
Dictionary<string, string> result = new Dictionary<string, string>();
string code = string.Empty;
Task.Run(() =>
{
foreach (var item in inputList)
{
code = CreateSingleOrder(item);
result.Add(item.TicketNumber, code);
}
////TODO: Write logic to send mail
emailSender.SendEmail("abc@xyz.com");
});
}
由于inputList
中可能有多个条目,并且每个条目可能需要5秒才能处理,因此我不希望为最终用户阻止该UI。相反,我会发送邮件并通知已成功处理的数量和所有失败的数据。
为了达到这个目的,我最了解的是Task.Run。但是,问题是一旦函数完成,我就不会看到foreach循环中的代码曾经有效,因为它从未对数据库做过。
任何人都可以帮我找出我在这里缺少的东西。
仅供参考,此功能从Web API调用,Web API POST方法从javascript调用。下面是Web API端点的代码。
[HttpPost, Route("SaveOrderList")]
[ResponseType(typeof(bool))]
public IHttpActionResult SaveOrderList(List<Order> orderList)
{
orderManagerService.SaveOrderList(orderList)
return this.Ok();
}
提前感谢您的帮助。
答案 0 :(得分:0)
您需要仔细考虑其工作原理。本文中有一些建议:
https://blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html
但我要指出,在Web应用程序上“发射并忘记”通常是错误的方法。
对于您的示例,您真的想要考虑您的用户体验 - 如果我在您的网站上下订单,然后只发现订单失败一段时间后(通过电子邮件,我可能没有检查),我会不要太印象深刻。最好等待保存结果,或者对单个订单项进行多个API请求,并在前端显示成功订单的增量结果。
我还建议您仔细研究为什么您的订单保存速度如此之慢 - 这将继续存在问题,直到它更快。