【发布时间】:2020-02-21 07:10:22
【问题描述】:
假设我在一个子例程或函数中有一个长操作,并且我希望能够在“取消标志”设置为真后立即取消(退出子例程或函数)。最好的方法是什么?一种方法是在每行代码之后检查标志,但这不是很优雅。
例如:
dim _CancelFlag as boolean = false
Sub LongOperation()
dim a as integer
a = 1
if _CancelFlag = True Then
Exit Sub
End If
a = 2
if _CancelFlag = True Then
Exit Sub
End If
'And so on...
End Sub
当然a = 1 仅用于说明目的。假设操作真的很长,直到a = 100 并且不可能将它们放入循环中,我如何从子程序外部触发取消并立即停止它?
我正在考虑将 sub 放入 BackgroundWorker 或 Task,但我仍然需要检查 sub 内部某处的 CancellationToken。我真的必须在每一行代码之后检查吗?
【问题讨论】:
-
这能回答你的问题吗? Proper way of cancel execution of a method
-
是的,你必须这样做。
BackgroundWorker执行冗长的例程,主线程保持 UI 响应,包括例如通过在其Click事件中设置CancelFlag = True将cancel任务的按钮。 -
是的,但是需要在后台工作人员 DoWork 内部捕获取消标志并从内部取消,对吗?如果上面的子例程在 BackgroundWorker 的 DoWork 中,我应该在哪里检查: if worker.CancellationPending = True ?
-
所有取消令牌示例都在循环内。在循环结束时检查取消标志。这与我的问题不同。
-
重点是你不应该做你想做的事。您可以
Abort一个线程,但通常建议不要这样做,因为它会使系统处于未知状态。你应该明确地检查和取消的原因是为了让你知道你已经清理了任何需要它的东西。