.NET 性能最佳做法:请勿在后台线程中捕获HttpContext

请勿这样做:下面的示例演示闭包从 Controller 属性捕获 。这是一种不良做法,因为工作项可能:

  • 在请求范围之外运行。

  • 尝试读取错误的 HttpContext。.

[HttpGet("/fire-and-forget-1")]public IActionResult BadFireAndForget(){    _ = Task.Run(async () =>    {        await Task.Delay(1000);
        var path = HttpContext.Request.Path;        Log(path);    });
    return Accepted();}

请这样做:下面的示例:

  • 在请求期间复制后台任务中所需的数据。

  • 不从控制器引用任何内容。

[HttpGet("/fire-and-forget-3")]public IActionResult GoodFireAndForget(){    string path = HttpContext.Request.Path;    _ = Task.Run(async () =>    {        await Task.Delay(1000);
        Log(path);    });
    return Accepted();}

后台任务应作为托管服务实现。有关详细信息,请参阅使用托管服务的后台任务。