当执行到达Me.Invoke时,它会挂起

时间:2014-08-20 15:42:48

标签: vb.net multithreading thread-safety invoke invokerequired

我已将代码简化为单个表单,如下所示:

Imports System.Threading.Tasks

Public Class frmTest
    Inherits Form

    Public Sub WorkerSub(oAction As action)
        Dim x = 0
        oAction.Invoke()
        x += 1
    End Sub

    Private Sub Test()
        If Me.InvokeRequired Then
            Me.Invoke(Sub()
                          Test()
                      End Sub)
        Else
            MsgBox("Test")
        End If
    End Sub

    Private Sub btnTrigger_Click(sender As Object, e As EventArgs) Handles btnTrigger.Click
        Dim tt As Task = Task.Factory.StartNew(Sub()
                                                   WorkerSub(AddressOf Test)
                                               End Sub)
        tt.Wait()

        ' Never arrives here
        Stop
    End Sub

End Class

执行Sub Test中的Me.Invoke(sub() ...时,它会挂起。没有错误抛出&事件查看器中没有任何内容。

即使按F11,Debug Into,它也会挂起。

任何想法?

由于

JP

1 个答案:

答案 0 :(得分:1)

找到了问题。

主线程正在等待另一个线程完成。

t.Wait()

主线程上的调用需要等待,因此存在死锁。