取消所有 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? 和类似的帖子,了解人们试图绕过该限制的技巧。基本上,除了使您的代码在所有调用中真正异步和可取消外,您无能为力。
如果我连续启动几个可能阻塞的 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? 和类似的帖子,了解人们试图绕过该限制的技巧。基本上,除了使您的代码在所有调用中真正异步和可取消外,您无能为力。