gpt4 book ai didi

c# - 跟踪已完成/正在运行的 System.Threading.Tasks.Task 对象

转载 作者:行者123 更新时间:2023-11-30 17:10:37 26 4
gpt4 key购买 nike

我正在编写一个接收消息/请求并异步执行它们的 Windows 服务 - 它不需要等待项目完成,也不关心结果。我成功地能够使用 System.Threading.Tasks.Task 将请求作为任务执行。大多数这些项目执行速度很快(不到一秒),但有些需要更长的时间(2-3 分钟)。

作为 Windows 服务,我需要响应“停止”命令,一些任务仍将运行。最好不要取消任务,因为运行时间较长的任务可能会使数据处于错误状态(并且回滚非常棘手)。

处理此问题的最佳方法是什么?我想保留一份我已经开始的任务列表,这样我就可以做一个 WaitAll。在服务执行期间,它将处理数以万计的请求。我怎么知道什么时候从列表中删除已完成的任务,这样列表就不会疯狂增长?我认为我不应该持有对那么多 Task 对象的引用。

提前致谢。

最佳答案

您可以使用 CancellationToken为此目的。一旦 OnStop 事件发生,您只需调用方法 Cancel()CancellationTokenSource 上它将传播到您传递 token 的所有任务。有几种方法可以正确取消任务。如果请求取消,您可以不时明确检查任务内部。或者我相信 token 本身有一个属性 ThrowWhenCancelled,如果请求取消 token 将抛出 CancellationException。 .

如果你不关心任务结果,但想要一个跟踪列表,就保留List<Task<T>> (或者可能是 ConcurrentBag<Task<T>> )作为局部变量。不时启动另一个任务,该任务将遍历列表并检查 Task.Status属性,如果它正在运行或其他。

我不认为保留那么多引用应该是一个问题,只要您正确地维护这些引用。此外,这取决于您要如何停止应用程序。如果您对与应用程序一起被杀死的任务没有问题,您可能根本不会跟踪它们(除非它们持有一些资源,并且您需要释放它们)。但在大多数情况下,我会说它应该正确完成。

编辑:重新阅读您的帖子。 RequestAdditionalTime call 可以帮助你等到长时间运行的任务完成。在 MSDN 上查看:ServiceBase.RequestAdditionalTime Method

关于c# - 跟踪已完成/正在运行的 System.Threading.Tasks.Task 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12018837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com