VB.Net多线程InvokeRequired和传递线程

时间:2015-12-19 03:11:06

标签: vb.net multithreading invoke

我需要能够将线程名称传递给子程序,以便在需要时中止它。

所以到目前为止我有这个:

 Dim BrowserSpawn As New System.Threading.Thread(AddressOf BrowserSub)
    BrowserSpawn.Start()

 Private Async Sub BrowserSub(BrowserSpawn)
...
End Sub

因为子例程在Form1组中创建了一个浏览器,所以我需要在子组中调用对这些控件的访问。

注意:如果我没有传递线程名称,这样可以正常工作。

 If Me.GroupNamehere.InvokeRequired Then
            Me.GroupNamehere.Invoke(New MethodInvoker(AddressOf BrowserSub))
        Else
           'Do nothing
        End If

当我传递线程名称时,这些在尝试编译时会成为问题:

Method does not have a signature compatible with delegate 'Delegate Sub MethodInvoker()'.

我希望这只是一种语法问题,但我似乎无法让它发挥作用。有没有办法在不破坏我的invokerequired支票的情况下传递这个线程名?

如果我尝试将其更改为明显的:

Me.GroupNamehere.Invoke(New MethodInvoker(AddressOf BrowserSub(BrowserSpawn)))

它告诉我Addressof操作数必须是方法的名称(没有括号)。虽然没有括号但它也不开心,所以我不知道从哪里去。

/编辑:

偶然发现How can I create a new thread AddressOf a function with parameters in VB?

这似乎证实了我尝试传递的内容如下:

Private Sub test2(Threadname As Thread)
    ' Do something
End Sub

这个子似乎很高兴。但是我不确定如何在不破坏调用者部分的情况下做到这一点。

 Me.GroupNameHere.Invoke(New MethodInvoker(AddressOf SubNameHere))

正常工作。如果SubNameHere()成为SubNameHere(threadname作为线程),那么看起来很开心但调用行中断并且不需要超过地址。

1 个答案:

答案 0 :(得分:-1)

两个轻微的语法更改对其进行了排序:

Private Async Sub SubName(ThreadNameAs Thread)

GroupName.Invoke(New MethodInvoker(Sub() Me.SubName(ThreadName)))