6

オプション strict が OFF の場合、正常に動作します。オン、オーバーロードの解決に失敗しました:

Dim _thread1 As Thread

Private Sub test2(boolTest As Boolean)
    ' Do something
End Sub
'
Private Sub test()
    _thread1 = New Thread(AddressOf test2)
    _thread1.Start(True)
End Sub

アクセス可能な 'New' を次の引数で呼び出すことができないため、オーバーロードの解決に失敗しました:

'Public Sub New(start As System.Threading.ParameterizedThreadStart)': Option Strict On では、メソッド 'Private Sub test2(boolTest As Boolean)' とデリゲート 'Delegate Sub ParameterizedThreadingStart(obj As Object)' の間の暗黙的な型変換で絞り込みが許可されません.

'Public Sub New(start As System.Threading.ThreadStart)': メソッド 'Private Sub test2(boolTest As boolean)' には、デリゲート 'Delegate Sub ThreadStart()' と互換性のある署名がありません。

http://i.imgur.com/X0mH9tm.png

私はスレッド化が初めてです..パラメーターのない関数は問題ないようですが、WITHパラメーターはありますか? タフ。これどうやってするの?私はすでに検索しましたが、ほとんどの場合、java/js はこの質問にしか答えていません。

4

3 に答える 3

6

この方法でスレッドを開始する場合、関数には 1 つ以下のパラメーターが必要です。パラメーターを 1 つ指定する場合は、 type からのものでなければなりませんObject

関数では、このオブジェクト パラメータをデータ型に単純にキャストできます。

private sub startMe(byval param as Object)
     dim b as Boolean = CType(param, Boolean)
     ...
end sub

複数のパラメータを渡したい場合は、次のようにクラスにまとめることができます。

public class Parameters
     dim paramSTR as String
     dim paramINT as Integer
end class

private sub startMe(byval param as Object)
     dim p as Parameters = CType(param, Parameters)
     p.paramSTR = "foo"
     p.paramINT = 0
     ...
end sub

スレッドを開始するには:

dim t as new Thread(AddressOf startMe)
dim p as new Parameters
p.paramSTR = "bar"
p.oaramINT = 1337
t.start(p)
于 2015-05-11T08:13:40.633 に答える
1

委譲先のメソッドに Boolean パラメーターがあるためのようです: '...does not allow nineing...' オブジェクトを使用するように署名を変更してください。

于 2015-05-11T08:07:57.127 に答える
1

al-eax's answerに従う必要がありますが、別の方法は、関数にパラメーターをまったく渡さずに、サブThread.Start()で評価することです...test

Dim _thread1 As Thread

Private Sub test()
    If someTest = True then    
        _thread1 = New Thread(AddressOf test2)
        _thread1.Start()
    End If
End Sub

Private Sub test2()
    /.../
End Sub

...またはグローバル変数として宣言します...

Dim _thread1 As Thread
Dim boolTest As Boolean

Private Sub test()
    boolTest = True

    _thread1 = New Thread(AddressOf test2)
    _thread1.Start()
End Sub

Private Sub test2()
    If boolTest = True Then
        /.../
    End If
End Sub
于 2015-05-11T08:23:05.623 に答える