我的程式的一部分由一系列步驟組成,這些步驟要么完成,要么在特定時間間隔后超時。測驗條件差異很大。如何撰寫一個函式來封裝所有可能性?
為此,我理想情況下需要將必要條件傳遞給要在函式內求值的函式,而不是將其作為引數求值然后傳遞給函式。
這就是我理想中想要的(大大簡化):
Private Function TestCondition(<CONDITION>) as Boolean
' Returns True if <CONDITION> fulfilled within 10 seconds
Dim sw as New Diagnostics.StopWatch
sw.Start()
While sw.ElapsedMilliseconds < 10000
If <CONDITION> Return True
System.Threading.Thread.Sleep(500)
End While
sw.Stop()
Return False
End Function
函式應該與任何回傳布林值的運算式一起使用:
TestCondition(x=5)
TestCondition(System.IO.File.Exists("myfile")
顯然,上述方法不起作用,因為指定條件的結果被傳遞給函式,而不是條件本身。
根據其他閱讀,我可能可以通過以下方式完成此操作:
- 重構我的代碼
- 使用委托
- 使用 lambda 運算式
但我仍然不明白究竟如何。
非常感謝你的幫助!
uj5u.com熱心網友回復:
您可以將 lambda 傳遞給可以不斷重新評估的函式。
Private Function TestCondition(predicate As Func(Of Boolean)) As Boolean
Dim sw As New Diagnostics.Stopwatch()
sw.Start()
While sw.ElapsedMilliseconds < 10000
If predicate() Then Return True
System.Threading.Thread.Sleep(500)
End While
sw.Stop()
Return False
End Function
Dim result = TestCondition(Function() File.Exists("myfile"))
uj5u.com熱心網友回復:
基本上和djv說的一樣,
''' <summary>
''' waits for a condition for a number of seconds
''' </summary>
''' <param name="PredicateFunc">Function() conditional check )</param>
''' <param name="WaitForTMInSecs">seconds to wait</param>
''' <returns>boolean</returns>
''' <remarks></remarks>
Private Function TestCondition(PredicateFunc As Func(Of Boolean),
Optional WaitForTMInSecs As Integer = 10) As Boolean
Dim sw As Diagnostics.Stopwatch = Diagnostics.Stopwatch.StartNew
Dim _wait As TimeSpan = TimeSpan.FromSeconds(WaitForTMInSecs)
Dim rv As Boolean = PredicateFunc()
Do While Not rv AndAlso sw.Elapsed <= _wait
System.Threading.Thread.Sleep(500)
rv = PredicateFunc()
Loop
Return rv
End Function
測驗,
Dim result As Boolean
result = TestCondition(Function() String.Equals("foo", "bar"), 2)
result = TestCondition(Function() String.Equals("foo", "foo"), 2)
result = TestCondition(Function() IO.File.Exists("myfile"), 2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/378925.html
