Mar*_*tin 18 .net c# asynchronous c#-3.0
如何取消异步调用?.NET APM似乎不支持此操作.
我的代码中有以下循环,它在ThreadPool上生成多个线程.当我单击UI上的按钮时,我希望这些线程(或异步调用)结束.
foreach (var sku in skus)
{
loadSku.BeginInvoke(...
}
Run Code Online (Sandbox Code Playgroud)
除了创建全局"取消标志"并使用异步方法查找它之外,还有其他优雅的解决方案吗?
Nei*_*ell 18
"取消标志"是这样做的方式,虽然不是全球性的,但必然.不可避免的一点是,你需要某种方式向线程发出信号,告诉它应该停止它正在做的事情.
在这种情况下BeginInvoke,除了全局标志之外,这很难做到,因为工作是在线程池上进行的,而你不知道哪个线程.您有几个选项(按优先顺序排列):
BackgroundWorker而不是BeginInvoke.这具有取消功能.这还有其他好处,例如进度监控和"工作完成"回调.它也很好地处理异常.ThreadPool.QueueUserWorkItem,传入一个对象作为具有Cancel()设置Cancelled执行代码可以检查的标志的方法的状态.当然,您需要保留对状态对象的引用,以便您可以调用Cancel()它(这BackgroundWorker对您有用 - 您的表单上有一个组件.(感谢Fredrik提醒您).ThreadStart委托,与选项2一样传入状态对象.| 归档时间: |
|
| 查看次数: |
10230 次 |
| 最近记录: |