如何在当前任务阻塞时在 .NET 中计划另一个任务

本文关键字:计划 另一个 NET 任务 当前任务 | 更新日期: 2023-09-27 18:35:57

对于我的 .NET 4.0 项目,我使用的是并发程度有限的自定义TaskScheduler(类似于 MSDN 上的 LimitedConcurrencyLevelTaskScheduler 示例)。它执行的一堆任务在等待其他操作返回结果然后继续工作时会阻塞。因为很遗憾这个调度程序的线程在这段时间内没有任何可做,所以我想在一个块时调度另一个任务。

我想也许TPL可以看到任务何时被阻止,然后安排其他事情,但我对Monitor.Wait()或等待ManualResetEvent的实验表明情况并非如此。由于我已经在使用自己的任务调度程序,我认为可能有办法明确地告诉它安排另一个任务,但我还没有找到任何关于TaskTaskScheduler等方法

请注意,延续在这里不起作用,因为我正在执行一项任务。另外,我真的很想避免将任务分成两个,一个等待前和等待后任务,因为可能有几个点需要等待,将它们全部拆分会导致我的原始算法的碎片化程度,使其难以维护。我想像异步 CTP 中的await这样的东西会有所帮助,但我必须坚持使用 .NET 4。

我是否缺少一些东西来告诉任务计划程序取消下一个任务的队列,然后在该任务完成后返回到当前任务?

如何在当前任务阻塞时在 .NET 中计划另一个任务

如果你有自己的TaskScheduler,TPL不会安排任何事情,那是TaskScheduler的工作。

如果您想要某种方式来告诉您的自定义TaskScheduler安排另一个Task,则必须自己将其添加到您的TaskScheduler中。而且您不能执行新Task然后"回到"旧,因为无法暂停执行Task

但最简单的解决方案可能是使用默认TaskScheduler,因为它在决定调度多少Task时会考虑阻塞的Task

Task.ContinueWith 确实为您提供了在初始任务完成或出错后计划任务的选项。但这仅在初始任务运行完成时才有帮助。

没有内置这样的东西。若要避免此类问题,请使用非阻塞任务。

您还可以通过并行运行比 CPU 更多的线程来稍微超额订阅 CPU。这将导致轻微的低效率,但如果任务阻塞,您已经运行了其他"回填"任务并接管了 CPU。

相关文章: