6

When option strict is OFF, works fine. 开,我得到过载解决失败:

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

重载解析失败,因为无法使用这些参数调用可访问的“新”:

'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

我是线程新手..没有参数的函数似乎很好,但是有参数?艰难的。我怎样才能做到这一点?我已经搜索过了,大部分都看到 java/js 只回答了这个问题。

4

3 回答 3

6

当你以这种方式启动一个线程时,你的函数必须有一个或更少的参数。如果您指定一个参数,则它必须来自 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

看起来这是因为您委托给的方法有一个布尔参数:'...不允许缩小...' 更改签名以使用 Object.

于 2015-05-11T08:07:57.127 回答
1

您应该遵循al-eax 的回答,但另一种方法是根本不在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 回答