首页 > 解决方案 > 处理和处置废弃任务 c# .NET

问题描述

我有一个 Windows 服务,其中包含触发并忘记任务的方法。我想了解在 Windows 服务停止或重新启动时如何处理这些问题?

为清楚起见,我使用以下代码:_ = Task.Run(() => DoSomething());

如果此任务正在执行中途,Windows 服务如何处理停止以及重新启动服务?

(1) 我对重启的假设是服务的 OnStop() 方法将被调用,fire and forget 任务将继续。OnStart() 将被调用,并且再次触发并忘记任务应该继续。该任务将在完成后处理。在此过程中,.net 运行时是否会自动进行任何其他任务或内存管理?

(2) 我在停止时的假设是服务的 OnStop() 方法将被调用,即发即弃任务将继续。OnStop 方法将返回,然后服务将被终止,因此会终止火灾并忘记任务。

(3) 因此,根据我自己的假设,使用“一劳永逸”任务不应阻止服务停止或重新启动。

注意:我无法停止和重新启动服务。所以我试图确定这里的行为。有人可以确认或否认我的假设吗?谢谢。

标签: c#.netservicetasktask-parallel-library

解决方案


即发即弃的任务总是有风险的。如果在即发即弃任务中发生未处理的异常,它将拆掉你的整个过程让您的进程处于可能未定义和可能不稳定的状态,因为可能存在损坏的数据或分配的资源。

在服务领域,即发即弃的任务带来了另一个风险。见官方文档

如果服务在所有线程退出之前向 SCM 报告服务已停止,则 SCM 可能会将其解释为矛盾。这可能会导致无法停止或重新启动服务的状态。

我的建议是避免一劳永逸的任务。当您触发此类任务时,请将其添加到列表中。在您的OnStop方法中,浏览此列表并等待所有任务完成。如果您有可以取消的任务,请取消它们并再次等待它们完成。


推荐阅读