处理复杂条件的逆

时间:2014-01-22 14:50:31

标签: vb.net while-loop conditional-statements

我有一个相当复杂的条件,实际上在我的代码中结合了一些嵌套条件:

Sub RunWorkload()
    If iisSvr1rstdone = True And (iisSvr2rstdone = True Or utilnamespace.iisSvr2 = "") And (rptSvrrstdone = True Or utilnamespace.rptSvr = "") And (Workload.chkCache.Checked = False Or sqlSvrrstdone = True) Then
        Workload.txtStatus.Text = "Running Workload..."
        <more things happen>
    End If
End Sub

我的问题是,由于代码是现在编写的,它只会触发一次评估,这根本不起作用。每个done变量都是一个布尔值,作为“我做完了!”的一部分填充。事件。因此,如果它目前没有填充,则应定期重新评估。

这让我想到了我现在的问题:我正在考虑将If替换为While,但这将涉及写出该条件的反转,如下所示:

While iisSvr1rstdone = False And (iisSvrrstdone = False or utilnamespace.iisSvr IsNot Nothing) And (rptSvrrstdone = False or utilnamespace.rptSvr IsNot Nothing) And (Workload.chkCache.Checked = True or sqlSvrrstdone = True)

我可以循环直到它评估为True。我的问题是,它似乎......过于复杂,我担心我会遗漏一些会简化它的东西。我的另一个想法是将If语句的结果存储为一个单独的函数,这样我就可以让While语句不断运行该函数,直到它的计算结果为真。

我是否遗漏了任何可以点击此概念的内容?

2 个答案:

答案 0 :(得分:1)

“反转”布尔语句的最简单方法是使用

If Not (a=b) Then

而不是

If a=b Then

我注意到代码的最后一部分

(Workload.chkCache.Checked = False Or sqlSvrrstdone = sqlSvrrstdone = True)

没有意义,因为Or之后的部分总是正确的,所以整个事物总是为True,然后,因为它是和其他部分连接将使整个事情变得不必要。也许这是你的代码中的一个错误,或者你可以删除整个事情。 要手动撤消陈述,您可以将所有= True替换为= False,将Or替换为And,反之亦然。所以它会是

If iisSvr1rstdone = False Or _
   (iisSvr2rstdone = False And utilnamespace.iisSvr2 <> "") Or _
   (rptSvrrstdone = False And utilnamespace.rptSvr <> "") Then

这应该与你的if语句相反,如果我没有弄乱的话。我之前提到的不必要的部分将被删除。

对这种类型的代码使用单独的函数总是一个好主意,因为它使代码更具可读性。

答案 1 :(得分:1)

我会制作一个在条件不满足的情况下等待的方法。我将它们分成单独的块以提高可读性。 Async / Await允许UI线程继续处理其他事件,或者您可以通过直接调用waitForServersReady来阻止它。

Private iisSvr1rstdone, iisSvr2rstdone, rptSvrrstdone, sqlSvrrstdone, WorkloadchkCacheChecked As Boolean
Private utilnamespaceiisSvr2, utilnamespacerptSvr, WorkloadtxtStatusText As String

Private Sub waitForServersReady()
    While Not iisSvr1rstdone
        System.Threading.Thread.Sleep(1)
    End While
    While Not (iisSvr2rstdone Or utilnamespaceiisSvr2 = "")
        System.Threading.Thread.Sleep(1)
    End While
    While Not (rptSvrrstdone Or utilnamespacerptSvr = "")
        System.Threading.Thread.Sleep(1)
    End While
    While Not (WorkloadchkCacheChecked Or sqlSvrrstdone)
        System.Threading.Thread.Sleep(1)
    End While
End Sub

Async Sub RunWorkload()
    Await Task.Factory.StartNew(AddressOf waitForServersReady)
    ' you can also just waitForServersReady()
    WorkloadtxtStatusText = "Running Workload..."
End Sub