我有一个相当复杂的条件,实际上在我的代码中结合了一些嵌套条件:
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语句不断运行该函数,直到它的计算结果为真。
我是否遗漏了任何可以点击此概念的内容?
答案 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