将Enqueue方法放入异步包装器并让控制器以这种方式调用是个好主意吗?
哪个更好,为什么?
同步:
public IActionResult AddLogs(List<Log> logs)
{
BackgroundJob.Enqueue(() => DM.AddLogsBackground(logs));
return Ok();
}
异步:
public async Task<IActionResult> AddLogs(List<Log> logs)
{
await DM.AddLogs(logs);
return Ok();
}
public async Task AddLogs(List<Log> logs)
{
BackgroundJob.Enqueue(() => AddLogsBackground(logs));
}
Enqueue方法不会立即调用目标方法,它会 而是运行以下步骤:
- 序列化方法信息及其所有参数。
- 根据序列化的信息创建一个新的后台作业。
- 将后台作业保存到持久存储中。
- 将后台作业排入队列。
答案 0 :(得分:0)
哪个更好,为什么?
由于BackgroundJob.Enqueue
未被等待(也不等待),因此它将被同步处理。
因此,所有异步语法在这里都是无用的且具有误导性。
请注意,您的DM.AddLogsBackground
can be an async method。但是据我所知,处理仍将在后台作业服务器上同步。