处理和处置丢弃的任务 c# .NET

Handling and disposing of discarded tasks c# .NET

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

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

如果此任务正在执行中,windows 服务如何处理服务的停止和重启?

(1) 我对重启的假设是将调用服务的 OnStop() 方法,即发即弃任务将继续。 OnStart() 然后将被调用,发射后遗忘任务将再次继续。任务将在完成时处理。在此过程中,是否有任何其他由 .net 运行时自动发生的任务或内存管理?

(2) 我对停止的假设是将调用服务的 OnStop() 方法,即发即弃任务将继续。 OnStop 方法将 return,然后服务将被终止,因此终止了任务。

(3) 因此,根据我自己的假设,使用即发即弃任务不应阻止服务停止或重新启动。

注意:我在停止和重新启动服务时遇到问题。所以我试图确定这里的行为。任何人都可以证实或否认我的假设吗?谢谢。

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

在服务中,即发即弃的任务会带来另一种风险。见 official documentation:

If the service reports to the SCM that the service has stopped before all threads have exited, it is possible that the SCM will interpret this as a contradiction. This might result in a state where the service cannot be stopped or restarted.

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