1

したがって、この人物のコードがhttp://www.codeproject.com/KB/cs/Threadsafe_formupdating.aspxのVB.NETに変換されたコメントセクションから、クロススレッドUIのものを呼び出すのに役立つ小さなコードが示されています。

<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拡張メソッドのタイプパラメータのデータ型'PublicFunction SafeInvoke(Of TResult)(ByRef call As System.Func(Of frmLogin、TResult))As TResult' defined in'GvE.Globals'これらの議論から推測されます。データ型を明示的に指定すると、このエラーが修正される場合があります。C:\ GvE \ GvE \ frmLogin.vb 37 9 GvE

私は何が欠けていますか?フォームで定義されたメソッド内からそのコードを呼び出していますが、そのメソッドは別のスレッドから呼び出されています。

デリゲートを避けようとしているだけで、これは上記のコードが実行することになっていることですが、それを機能させることはできません。

ありがとう

4

1 に答える 1

2

あなたのSafeInvokeメソッドはFunc(Of T, TResult). これは、 を受け取ってを返す
関数です。 T TResult

x.Close()は であり、Sub何も返さないため、 にすることはできませんFunc(Of T, TResult)

を受け取るオーバーロードを作成する必要があります– を受け取り、何も返さないAction(Of T)サブルーチン。T

于 2011-07-25T01:46:12.730 に答える