So from the comments section where this persons code was translated to VB.NET on http://www.codeproject.com/KB/cs/Threadsafe_formupdating.aspx it shows a little code to aid in calling cross thread UI stuff.
<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
When I try to call the following however I get an error:
Me.SafeInvoke(Function(x) x.Close())
or
frmLobby.SafeInvoke(Function(x) x.Close())
Error 1 Data type(s) of the type parameter(s) in extension method ‘Public Function SafeInvoke(Of TResult)(ByRef call As System.Func(Of frmLogin, TResult)) As TResult’ defined in ‘GvE.Globals’ cannot be inferred from these arguments. Specifying the data type(s) explicitly might correct this error. C:\GvE\GvE\frmLogin.vb 37 9 GvE
What am I missing? I’m calling that code from inside a method defined in a form but that method is being called from another thread.
Just trying to avoid delegates and this is what the code above is supposed to do, but just can’t get it to work.
Thanks
Your
SafeInvokemethod takes aFunc(Of T, TResult).That’s a function that takes a
Tand returns aTResult.Since
x.Close()is aSuband doesn’t return anything, you can’t make it into aFunc(Of T, TResult).You should make an overload that takes an
Action(Of T)– a sub that takes aTand doesn’t return anything.