【发布时间】:2023-03-20 11:00:01
【问题描述】:
Slender 回答了我最初的问题,即发送 HTTP 响应后会发生什么触发和遗忘,但现在我剩下的问题是如何正确地将后台任务排队
编辑
众所周知,Async void 通常很糟糕,except for in the case when it comes to event handlers,我想执行一些后台逻辑而不必让客户端等待。我最初的想法是使用 Fire and Forget
假设我有一个活动:
public event EventHandler LongRunningTask;
然后有人订阅了一个fire and forget task:
LongRunningTask += async(s, e) => { await LongNetworkOperation;};
web api 方法被调用:
[HttpGet]
public async IActionResult GetTask()
{
LongRunningTask?.Invoke(this, EventArgs.Empty);
return Ok();
}
但是如果我这样做,我的长时间运行的任务不能保证完成,我怎样才能在不影响发出请求的时间的情况下处理正在运行的后台任务(例如,我不想等待任务先完成)?
【问题讨论】:
-
既不能保证运行完成,也不会被丢弃。网络服务器不是执行长时间运行的作业的最佳场所,您需要了解网络服务器插入代码的后果(例如,如果您在 IIS 和应用程序池托管中运行您的代码会被回收),以及运行“副业”对您的服务器及时实际提供页面的能力的影响。
-
@spender,所以这些任务会泄漏内存,我想这样做的唯一原因是为了我的 websocket,如果更新后需要向 1000 个客户端广播,我希望更新到发生并返回,而不是等待所有这些都必须发送
标签: c# events async-await .net-core