将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方法不会立即调用目标方法,而是运行以下步骤:
- 序列化方法信息及其所有参数。
- 根据序列化信息创建新的后台作业。
- 将后台作业保存到持久存储。
- 将后台作业排入队列。
哪个更好?为什么?
由于没有等待BackgroundJob.Enqueue
(也不等待),它将同步处理。
因此,所有异步语法在这里都是无用的和误导性的。
请注意你的DM.AddLogsBackground
can be an async method。但据我所知,后台作业服务器上的处理仍然是同步的。