【问题标题】:Handling and disposing of discarded tasks c# .NET处理和处置废弃任务 c# .NET
【发布时间】:2020-04-28 20:47:51
【问题描述】:

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

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

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

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

(2) 我对停止的假设是服务的 OnStop() 方法将被调用,即发即弃任务将继续。 OnStop 方法将返回,然后服务将被终止,从而终止火忘记任务。

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

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

【问题讨论】:

  • 您的假设符合我的假设,而我自己对 Windows 服务没有任何深入的了解。停止和重新启动服务时遇到了哪些问题?此外,在任何给定时刻,平均有多少个即发即弃的任务正在执行?

标签: c# .net service task task-parallel-library


【解决方案1】:

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

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

如果服务向 SCM 报告该服务之前已停止 所有线程都已退出,SCM 可能会解释 这是一个矛盾。这可能会导致以下状态 服务无法停止或重新启动。

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

【讨论】:

  • “如果在即发即弃的任务中发生未处理的异常,它将破坏你的整个过程。” Not true for .NET Framework 4.5 及更高版本。
  • 是的。但这并没有使问题变得不那么严重。您的进程将处于未定义状态。
  • 谢谢尼克。我已取消处理对象的任务,并确保在 OnStop 上调用 dispose。文档中的引用很有趣。这可能就是我正在发生的事情。
猜你喜欢
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
相关资源
最近更新 更多