2011-07-25 5 views
1

この人のコードはhttp://www.codeproject.com/KB/cs/Threadsafe_formupdating.aspxでVB.NETに翻訳されたコメントセクションから、クロススレッド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データ型(S)型パラメータ(複数可)の中拡張メソッド '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) –のサブセットにTが含まれ、何も返さないオーバーロードを行う必要があります。

+0

働いてくれてありがとう(ありがとう)。この種の作品を使用して他のフォームを表示していますが、ハングします。私は何が分かるかを見ていきます。 – user441521

関連する問題