Как я могу создать новый поток AddressOf функции с параметрами в VB?

Когда опция strict выключена, работает нормально. ВКЛ, ошибка разрешения перегрузки:

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)' и делегатом 'Делегировать 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 отвечает только на этот вопрос.


person Community    schedule 11.05.2015    source источник
comment
Кроме того, прочтите это.   -  person Zohar Peled    schedule 11.05.2015
comment
В будущем постарайтесь включить соответствующий код, а также сообщения об ошибках в вопрос.   -  person Justin Ryan    schedule 11.05.2015


Ответы (3)


Когда вы запускаете поток таким образом, ваша функция должна иметь один или несколько параметров. Если вы указываете один параметр, он должен быть из типа 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)
person al-eax    schedule 11.05.2015

Похоже, это потому, что метод, которому вы делегируете, имеет логический параметр: '... не позволяет сужать ...' Измените подпись, чтобы использовать Object.

person David Osborne    schedule 11.05.2015

Вы должны следовать ответ 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
person Viktor Ek    schedule 11.05.2015
comment
Вы можете использовать это, когда создаете только один поток. Я не уверен, что нативные типы данных, такие как bool и int, сохраняются в .net. Вы не должны использовать глобальную переменную таким образом для параметризации нескольких потоков. - person al-eax; 11.05.2015
comment
Согласно MSDN, логические значения являются потокобезопасными. Вы никогда не упоминали, что хотите использовать несколько новых потоков или что все они зависят от одного и того же логического параметра, но в этом случае вы должны следовать ответу al-eax. - person Viktor Ek; 11.05.2015