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