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

问题描述 投票:0回答:1

我有一个windows服务,其中有一些方法可以启动和忘记任务。 我想弄清楚当windows服务停止或重新启动时如何处理这些方法?

为了清楚起见,我使用了这样的代码:_ = Task.Run(() => DoSomething())。

如果这个任务是中途执行的,那么windows服务是如何对待服务的停止,以及重启的?

(1)我对重启的假设是,服务的OnStop()方法会被调用,fire and forget任务会继续。 然后,OnStart()方法会被调用,同样,fire and forget任务应该继续。 任务完成后会被处理掉。 在这个过程中,有没有其他的任务或内存的管理是由.net运行时自动发生的?

(2)我对stop的假设是,服务的OnStop()方法会被调用,fire and forget任务会继续。 OnStop方法会返回,那么服务就会被杀死,从而杀死fire and forget任务。

(3)因此,根据我自己的假设,使用fire and forget任务,应该不会阻止服务的停止或重启。

注意:我在停止和重启一个服务时遇到了麻烦。 所以我试图确定这里的行为。 谁能确认或否认我的假设? 谢谢,我有一个windows服务,它有方法可以停止和重启。

c# .net service task task-parallel-library
1个回答
1
投票

Fire-and-forget任务总是有风险的。 如果在fire-and-forget任务中发生未处理的异常,它将会 釜底抽薪 使您的进程处于潜在的未定义和潜在的不稳定状态,因为可能存在损坏的数据或分配的资源。

在服务中,fire-and-forget任务会带来另一个风险。 请参阅 公文:

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

我的建议是避免使用fire-and-forget任务。 当你启动这样的任务时,把它添加到一个列表中。 在您的 OnStop 方法,通过这个列表,等待所有任务完成。 如果你有任务可以取消,取消后再次等待任务完成。

© www.soinside.com 2019 - 2024. All rights reserved.