如果我连续启动几个可能阻塞的Task.Run(method)
,是否有办法发现(或缓存以供以后取消)等待lock{}
或{{ 1}}在Waitone()
内?
例如,如果我说:
method
我以后如何Task.Run(() =>
{
TradingSystem.QuoteUpdate(quote); //QuoteUpdate may block for several reasons
});
仅cancel
那些正好执行tasks
method
而还没有完成的任务?
答案 0 :(得分:4)
没有办法列出“所有任务”,更不用说“所有执行特定方法的任务”了。因此,如果以后需要遍历它们,则需要在创建时存储它们。
取消联系实际上不需要您知道任务,因为您可以将相同的取消令牌传递给所有此类任务-请参阅How to cancel a Task in await?。
但是...这对您没有帮助,因为任务取消是合作活动,并且在re.I
上阻塞的任务或任何其他等待将无法取消自己。请参阅How do I cancel a Blocked Task in C# using a Cancellation Token?和有关黑客尝试解决此限制的类似文章。基本上,除了使您的代码在所有调用中都真正异步且可取消之外,您无能为力。