当前位置: 首页 > 编程语言 > C#

如何取消异步调用?分享

时间:2023-04-10 22:25:05 C#

如何取消一个异步调用?如何取消异步调用?.NETAPM似乎不支持这一点。我的代码中有以下循环,它在ThreadPool上生成多个线程。我希望这些线程(或异步调用)在我单击UI上的按钮时结束。foreach(varskuinskus){loadSku.BeginInvoke(...}除了创建一个全局“取消标志”并使用异步方法查找它之外,还有一个优雅的解决方案吗?“取消标志”是这样做的方法,虽然不是全局的,但必然。不可避免的一点是你需要一些方法来通知线程它应该停止它正在做的事情。在BeginInvoke的情况下,除了全局标志之外,这是很难做到的,因为工作在线程池上执行,你不知道是哪个线程。你有几个选项(按优先顺序排列):使用BackgroundWorker而不是BeginInvoke。这有取消。这还有其他好处,例如进度监控和“工作done”回调。它还可以很好地处理异常。使用ThreadPool.QueueUserWorkItem,将对象作为具有Cancel()方法的状态传递,该方法设置执行代码可以检查的Canceled标志。当然,您需要跟踪A引用状态对象,以便您可以在其上调用Cancel()(这就是BackgroundWorker为您所做的-您的表单上有一个组件。(感谢Fredrik提醒您)。创建您自己的ThreadStart委托,与选项2相同,即传入状态对象。如果您正在寻找“TerminateAsnyc”方法,您将找不到。所以,不,在使用Control.BeginInvoke/EndInvoke时可能没有优雅的方法来执行此操作。因此,我将布尔标志放在UI线程上,让异步执行的委托在执行时定期检查标志。但是,您可以使用后台工作线程进行检查。肯定还有其他解决方案,虽然我不知道我会称之为“优雅”。您可以在线程上调用Abort或Interrupt,但这些可能会产生一些负面影响。就个人而言,如果可能,我更喜欢使用BackgroundWorker。它有一个Cancelfunction,但它类似于您提到的-类中的bool标志,您必须在执行代码时定期检查(至少它不是全局标志)。这篇关于在.NET中停止线程的帖子有点陈旧,但我在使用上述其他选项时遇到了一些陷阱。以上就是C#学习教程:如何取消异步调用?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: