c# - 处理和处置废弃任务 c# .NET
问题描述
我有一个 Windows 服务,其中包含触发并忘记任务的方法。我想了解在 Windows 服务停止或重新启动时如何处理这些问题?
为清楚起见,我使用以下代码:_ = Task.Run(() => DoSomething());
如果此任务正在执行中途,Windows 服务如何处理停止以及重新启动服务?
(1) 我对重启的假设是服务的 OnStop() 方法将被调用,fire and forget 任务将继续。OnStart() 将被调用,并且再次触发并忘记任务应该继续。该任务将在完成后处理。在此过程中,.net 运行时是否会自动进行任何其他任务或内存管理?
(2) 我在停止时的假设是服务的 OnStop() 方法将被调用,即发即弃任务将继续。OnStop 方法将返回,然后服务将被终止,因此会终止火灾并忘记任务。
(3) 因此,根据我自己的假设,使用“一劳永逸”任务不应阻止服务停止或重新启动。
注意:我无法停止和重新启动服务。所以我试图确定这里的行为。有人可以确认或否认我的假设吗?谢谢。
解决方案
即发即弃的任务总是有风险的。如果在即发即弃任务中发生未处理的异常,它将拆掉你的整个过程让您的进程处于可能未定义和可能不稳定的状态,因为可能存在损坏的数据或分配的资源。
在服务领域,即发即弃的任务带来了另一个风险。见官方文档:
如果服务在所有线程退出之前向 SCM 报告服务已停止,则 SCM 可能会将其解释为矛盾。这可能会导致无法停止或重新启动服务的状态。
我的建议是避免一劳永逸的任务。当您触发此类任务时,请将其添加到列表中。在您的OnStop
方法中,浏览此列表并等待所有任务完成。如果您有可以取消的任务,请取消它们并再次等待它们完成。
推荐阅读
- python - 在循环中用计数变量替换字符
- xamarin - 自定义开关不会在 Xamarin 表单中显示开/关图像
- pytorch - 如何从 Pytorch 中的 OpenAI 中删除 Cartpole 游戏中的显示渲染
- java - 防止用户提供的链接中包含 XSS 攻击的正确方法是什么?
- r - R检查值是否存在于组中
- linux - 100 轮循环 bash 脚本的分段错误(核心转储)
- sql - 查找 SQL 中的差异(棘手的情况)
- javascript - 未捕获的类型错误:在非对象上调用 CreateListFromArrayLike
- c++ - 在c ++上读取希腊字符形成文件
- android - 如何存储 Firebase 服务器时间戳加上 30 秒?