如何取消异步调用?.NET APM似乎不支持此操作。
我的代码中有以下循环,它在线程池上生成多个线程。当我在UI上点击一个按钮时,我希望这些线程(或异步调用)结束。
foreach (var sku in skus)
{
loadSku.BeginInvoke(...
}
除了创建全局的“取消标志”并让异步方法查找它之外,是否还有其他优雅的解决方案?
如何取消异步调用?.NET APM似乎不支持此操作。
我的代码中有以下循环,它在线程池上生成多个线程。当我在UI上点击一个按钮时,我希望这些线程(或异步调用)结束。
foreach (var sku in skus)
{
loadSku.BeginInvoke(...
}
除了创建全局的“取消标志”并让异步方法查找它之外,是否还有其他优雅的解决方案?
BeginInvoke
中,除了全局标志以外,很难使用其他任何东西来实现这个目的,因为工作是在线程池上完成的,而你不知道哪个线程在执行。你有几个选项(按优先顺序):
但是,你可以尝试使用后台工作线程。
肯定有其他解决方案,尽管我不知道是否应该称它们为“优雅”。
您可以在线程上调用Abort或Interrupt,但这些可能会产生一些负面影响。就个人而言,对于这样的问题,如果可能的话,我更喜欢使用BackgroundWorker。它具有取消功能,但类似于您提到的 - 在执行代码中必须定期检查的类中的bool标志(至少不是全局标志)。.NET中停止线程的此帖子有点旧,但概述了我上面提到的其他选项的一些缺点。