请勿这样做:下面的示例演示闭包从 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();}
后台任务应作为托管服务实现。有关详细信息,请参阅使用托管服务的后台任务。