使用使用lambda表达式的Action的Exit方法

时间:2016-10-19 00:56:58

标签: vb.net lambda

假设我有这种方法:

Sub Foo()
    Dim ac As Action = Sub()
                           Console.WriteLine("Aborting")
                           Exit Sub ' This will exit the Action not the caller method.
                       End Sub
    Console.WriteLine("1")
    ac()
    Console.WriteLine("2")
    Console.WriteLine("3")
    Console.WriteLine("4")
End Sub

我正在尝试使用Action退出调用它的方法(Foo)。显然,从lambda表达式中调用Exit Sub将退出动作本身而不是调用方法。

那么,有没有办法从Action的lambda表达式中触发Exit Sub Foo

为什么我要尝试这样做?

好吧,我有一个BackgroundWorker.DoWork事件,我需要多次触发相同的动作,我不想重复自己。通常的方法是使用所有重复的代码创建一个单独的方法,并在需要时调用方法。好吧,我不能这样做,因为某些“重复代码”无法通过单独的方法调用(例如e.Result = False& Exit Sub)。这就是为什么我想到使用Action这可能不是正确的方法。

还有其他方法可以解决这个问题吗?

修改(2)

基本上,我正在尝试执行以下操作:

    If condition1 Then Abort()
    If condition2 Then Abort()
    If condition3 Then Abort()

而不是:

    If condition1 Then 
        Abort()
        Exit Sub
    End If

    If condition2 Then 
        Abort()
        Exit Sub
    End If

    If condition3 Then 
        Abort()
        Exit Sub
    End If

注意:我无法将condition1condition2condition3合并在一起。

1 个答案:

答案 0 :(得分:2)

您尝试使用If condition1 Then Abort()进行的操作不正确。你还想做同样的事情,这是一个解决方法。你甚至可以使用try-catch块一级,即在Foo()之外。如果你想完全退出Foo(),但这取决于你的逻辑。

Sub Foo()
    Const EXCP_MSSG_ABORT As String = "Aborting-101"
    Try
        Dim ac As Action = Sub()
                               Console.WriteLine("Aborting")
                               Throw New Exception(EXCP_MSSG_ABORT)
                           End Sub
        Console.WriteLine("1")
        ac()
        Console.WriteLine("2")
        Console.WriteLine("3")
        Console.WriteLine("4")
    Catch ex As Exception
        'Just ignore the exception and exit OR you want to be specific then check the message and exit
        'If ex.Message = EXCP_MSSG_ABORT Then
        '    Console.WriteLine("Exited from Action")
        'End If
    End Try
End Sub