2017-01-09 85 views
0

返回結果前有沒有辦法讓函數等待一個特定的外部值? 這裏是一個非常基本的例子:等待returing函數結果前的值

Function DoSomething() As boolean 
'' ... do something external that takes time and sets a Registry value when done 
'' ... 

    Dim isTaskDone as Boolean 

    Do Until isTaskDone = True 
    isTaskDone = Registry.GetValue("ExternalValuePath", "valName", 0) 
    Loop 

    Return var 
End Function 

這實際上適用於我的需求,但我不知道,也許有實現這一目標的更優雅的方式? 另外我不確定這種解決方案是否可以像這樣保留(使用Until來有效地停止功能)。
我對一個相當模糊的問題表示歉意。

更新:
我想我要尋找某種簡單的一呼的解決方案,在那裏我可以調用一個函數,它做的一切,我需要返回,只有當一切都做的結果。所以我知道繼續是安全的。
我也嘗試過Timers,但我認爲在使用Timers時,一次調用解決方案中不可能包含所有內容。

+0

爲什麼你需要等待?它是[這個'Registry.GetValue'](https://msdn.microsoft.com/en-us/library/microsoft.win32.registry.getvalue(v = vs.110).aspx)方法嗎?如果是這樣,它不應該編譯,因爲它除了三個參數。 –

+0

該函數應該向外部應用程序發送命令並等待它們完成並將一些數據保存到磁盤。 我需要使用這些外部應用程序保存的數據。我需要等待,確保我獲得最新版本的保存數據。 –

+0

對不起。我正在簡化以提高我的示例的可讀性。是的,這是閱讀註冊表的一般方法。 –

回答

2

更好的方法是使用WMI創建註冊表觀察器。請參考link,它在C#中不應該是一個問題在VB.Net中轉換

+0

感謝您的回覆。我會研究這個。 –

1

您的方法使用一個繁忙的等待循環,這將鎖定您的用戶界面(並浪費您的CPU週期)。這可能是BackgroundWorker可能用於此,但您可能也可以用Timer完成它。也許不是很優雅,但它不會凍結你的界面。

因此,而不是讓它成爲一個函數,一個小組會做。然後添加一個Timer與默認Interval of 100.在您的DoSomething Sub,Enable計時器。而你的計時器代碼會是這樣的

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 

    If Registry.GetValue("ExternalValuePath", "valName", 0) Then 
     Timer1.Enabled = False 
     'do whatever needs to be done next 
    End If 

End Sub 
+0

謝謝你的回覆!事情是,我已經試着用'Timers'來做這件事。它的工作。我不喜歡'定時器'的是,「嘀嗒」是一個從Sub開始的'Timer'的獨立Sub。用定時器做這件事是不可能的,並且在一個子/功能中包含所有東西,是嗎? 我正在尋找的東西就像一個函數解決方案:我調用函數,並且它做我需要的一切(將數據發送到其他系統應用程序),並且只在所有事情都完成時返回結果,所以我知道繼續是安全的。 –

+0

@EdgarsMiškins我不相信,如果沒有導致UI或CPU問題。即使Mukul提供了另一個答案。無論何時你有某種類型的異步通信,你必須在一個循環中坐下,這是不好的,或者做一些更好的輪詢(定時器),或者某種回調事件,這通常是最好的路線。他的回答將更接近後者。 – topshot