2011-07-25 57 views
1

因此,從人員代碼被翻譯爲VB.NET的註釋部分http://www.codeproject.com/KB/cs/Threadsafe_formupdating.aspx它顯示了一些代碼來幫助調用交叉線程UI的東西。VB.NET在另一個線程上調用BeginInvoke

<System.Runtime.CompilerServices.Extension()> _ 
Public Function SafeInvoke(Of T As ISynchronizeInvoke, TResult)(ByRef isi As T, ByRef [call] As Func(Of T, TResult)) As TResult 
    If isi.InvokeRequired Then 
     Dim result As IAsyncResult = isi.BeginInvoke([call], New Object() {isi}) 
     Dim endResult As Object = isi.EndInvoke(result) 
     Return DirectCast(endResult, TResult) 
    Else 
     Return [call](isi) 
    End If 
End Function 

當我嘗試撥打下列但是我得到一個錯誤:

Me.SafeInvoke(Function(x) x.Close()) 

frmLobby.SafeInvoke(Function(x) x.Close()) 

錯誤1中的數據類型參數(一個或多個)的類型擴展方法'Public Function SafeInvoke(Of TResult)(ByRef call As System.Func(Of frmLogin,TResult))由於無法從這些參數中推斷'GvE.Globals'中定義的TResult'。明確指定數據類型可能會更正此錯誤。 C:\ GvE \ GvE \ frmLogin.vb 37 9 GvE

我錯過了什麼?我從表單中定義的方法中調用該代碼,但該方法正從另一個線程調用。

只是想避免代表,這是上面的代碼應該做的,但只是不能讓它工作。

感謝

+0

您使用的是什麼版本的VB.Net? – SLaks

+0

3.5 對不起米奇,我該怎麼辦?是否有某種接受答案按鈕,我應該點擊,這是否給予回答某種獎勵的人?對不起,我想我只是像對待任何其他論壇一樣對待,但也許我可以回去修復它。 – user441521

+0

@ user441521:沒有獎品。但聲譽。想一想就像說:「感謝你爲回答我的問題和幫助我而付出的努力」 –

回答

2

SafeInvoke方法採用Func(Of T, TResult)
這是一個功能,需要一個T並返回TResult

由於x.Close()Sub並且不返回任何內容,因此無法將其設置爲Func(Of T, TResult)

你應該做一個超載,需要一個Action(Of T) – sub需要T並且不返回任何東西。

+0

很酷的感謝工作(排序)。使用這種作品顯示其他表單,但它掛起。我會看看我能弄清楚什麼。 – user441521

相關問題