如何取消异步呼叫?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (1)
  • 查看 (15)

如何取消异步呼叫?.NET APM似乎不支持此操作。

我的代码中有下面的循环,它在ThreadPool上生成多个线程。当我单击UI上的一个按钮时,我希望这些线程(或异步调用)结束。

foreach (var sku in skus)
{
    loadSku.BeginInvoke(...
}

除了创建全局“Cancel标志”和使用异步方法查找它之外,还有其他优雅的解决方案吗?

提问于
用户回答回答于

一个“取消标志”是这样做的方式,虽然不是一个全球性的,必然的。不可避免的一点是你需要一些向线程发出信号,表示它应该停止它正在做的事情。

如属BeginInvoke,除了全局标志之外,任何事情都很难做到,因为工作是在线程池上执行的,而且您不知道哪个线程。您有两个选项(按优先顺序排列):

  1. 使用BackgroundWorker而不是BeginInvoke
  2. 使用ThreadPool.QueueUserWorkItem,将对象作为具有Cancel()方法设置Cancelled正在执行的代码可以检查的标志。当然,您需要保留对State对象的引用,以便可以调用Cancel()在上面(这是BackgroundWorker对你来说-你的表单上有一个组件。
  3. 创造你自己的ThreadStart委托,传入状态对象,与选项2一样。
用户回答回答于

如果正在寻找“TerminateAsnyc”方,将找不到。因此,不,在使用Control.BeginInvoke/EndInvoke时可能没有优雅的方法。因此,我会将布尔标志放在UI线程上,并让委托异步执行,在执行时定期检查该标志。可以签入使用后台工作线程。

扫码关注云+社区