首页 > 解决方案 > 在方法中的任何位置取消操作的最佳方法是什么?

问题描述

假设我在子例程或函数中进行了长时间操作,并且我希望能够在“取消标志”设置为 true 后立即取消(退出子例程或函数)。最好的方法是什么?一种方法是在每行代码之后检查标志,但这不是很优雅。

例如:

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 放入BackgroundWorkerorTask但是我仍然需要检查CancellationTokensub 内部的某个地方。我真的需要在每一行代码之后检查吗?

标签: c#.netvb.netalgorithm

解决方案


这取决于您想要达到的粒度:您希望您的方法取消多少秒?

如果必须“立即”取消,您必须尽可能多地办理登机手续。但是,在一般情况下,只需检查操作的长子步骤之前和之后就足够了。

请记住,如果您必须等待句柄,则必须使用指定超时或取消令牌的适当重载。

此外,您应该在您的方法深处传播取消令牌/您的标志,以允许及早检测取消请求。


推荐阅读