取消所有 Task.Run 执行特定方法

Cancel all Task.Run executing particular method

如果我连续启动几个可能阻塞的 Task.Run(method),有没有办法发现(或缓存以备后取消)被阻塞的任务,例如等待 lock{},或Waitone() 里面 method ?

例如,如果我说:

Task.Run(() =>               
{
    TradingSystem.QuoteUpdate(quote); //QuoteUpdate may block for several reasons
});

我如何稍后 cancel 只有那些 tasks 正在执行 method TradingSystem.QuoteUpdate 并且没有 运行 完成?

没办法列出来"all tasks",更不用说"all tasks executing particular method"了。因此,如果以后需要迭代它们,则需要在创建时存储它们。

取消实际上不需要您了解任务,因为您可以将相同的取消令牌传递给所有此类任务 - 请参阅 How to cancel a Task in await?

但是...这对您没有帮助,因为任务取消是合作的 activity 并且在 lock 或任何其他等待中被阻止的任务将无法自行取消。请参阅 How do I cancel a Blocked Task in C# using a Cancellation Token? 和类似的帖子,了解人们试图绕过该限制的技巧。基本上,除了使您的代码在所有调用中真正异步和可取消外,您无能为力。