任务不是异步运行

时间:2018-04-03 12:46:33

标签: c# asp.net-web-api async-await task-parallel-library

我已经将动作包裹在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();
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您需要仔细考虑其工作原理。本文中有一些建议:

https://blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html

但我要指出,在Web应用程序上“发射并忘记”通常是错误的方法。

对于您的示例,您真的想要考虑您的用户体验 - 如果我在您的网站上下订单,然后只发现订单失败一段时间后(通过电子邮件,我可能没有检查),我会不要太印象深刻。最好等待保存结果,或者对单个订单项进行多个API请求,并在前端显示成功订单的增量结果。

我还建议您仔细研究为什么您的订单保存速度如此之慢 - 这将继续存在问题,直到它更快。

相关问题