2013-08-01 165 views
0

我想從委託函數中獲取值。基本上我試圖從委託函數獲取richboxtext行長度。代表函數返回值

這裏是我的功能

Private Delegate Function getrichlengthmain(ByVal TB As RichTextBox) As String 

Private Function getrichlenghtdele(ByVal TB As RichTextBox) As string 

     Return TB.Lines.Length 


End Function 

而且我通過

Dim d As getrichlengthmain 

     d = AddressOf getrichlenghtdele 

dim returnvalue as string 

returnvalue = d.BeginInvoke(FstList,nothing,nothing) 

兩個問題在此代碼

1日問題

調用它,當我的代碼更改「 returnvalue = d.BeginInvoke(FstList,nothing,nothing)「to」d.BeginInvoke(FstList,nothing,nothing)「

的跨線程錯誤彈出式視窗,同時debuiging

第二個問題

我如何從函數的值沒有得到任何橫紗錯誤。

非常感謝您的時間和提前感謝解決它。

+1

'BeginInvoke'用於異步調用委託。那是你想要做的嗎?如果是這樣,你可能不希望在功能可能仍在運行時得到結果。如果不是,你爲什麼使用'BeginInvoke'? – hvd

+0

感謝您的回覆。我正在使用begininvoke,因爲我想讓函數安全地從richtextbox獲取行長度。有沒有其他方法可以通過使用函數來從richtextbox安全地獲取行長度。 –

回答

0

您遇到錯誤是因爲您嘗試訪問的控件是在與您正在訪問的控件不同的線程上創建的。在.Net中開發線程化UI應用程序時,這是一個常見的錯誤。

有(至少)兩種方式來解決你有問題,懶惰的方式和正確的方式。這個解決偷懶的方法,您只需通過包括下面這行代碼在某處你的UI組件發生停止非法跨線程調用來控制檢查:

Control.CheckForIllegalCrossThreadCalls = False 

一種更好的方式來處理問題是爲了確保你的代碼在正確的線程上執行(因此保持線程安全)。描述完成此的一種方法是here

+0

設置「CheckForIllegalCrossThreadCalls」將使代碼有時起作用,這取決於通常不受程序員控制的情況。有時有時可能會顯示爲「通常」,其他時間顯示爲「很少」。我知道你不推薦它,但你確實說它解決了這個問題,當它可能不會。 – hvd

+0

感謝您的回覆。是CheckForIllegalCrossThreadCalls = False不是最佳做法。它通常會讓我的應用程序崩潰。這就是爲什麼我想安全地調用richtextbox來返回它的值。爲此,我使用委託功能,但堅持它。 Wohoooo很thaaaaaaaaaaaaanks。你給出的鏈接解決了我的問題。 –