MultiThreaded解决方案,以避免DialogBox暂停执行

时间:2016-11-24 09:16:50

标签: vb.net multithreading automation

我目前正在VB.NET consoleApplication中对库进行一系列调用。功能调用通常需要一系列用户选择的输入。我的问题是,一组这些函数创建一个以编程方式无法访问的DialogBox实例,并暂停程序的执行,直到它们与之交互。

目前我已尝试根据以下代码使用多个线程来解决此问题。

Public Sub StartFormFunction(ByVal inputValue As String)
       frameWork.showHiddenDialogBox(inputValue)
End Sub

Public Sub threadFunction(ByValue inputValue As String)
    Dim nrOfOpenForms As Integer = Application.OpenForms.Count()       
    Try               
        Dim t As New Thread(New ParameterizedThreadStart(AddressOf StartFormFunction))
        t.Priority = Threading.ThreadPriority.Highest
        t.Start(inputValue)
        'Wait until the prompt has been created.            
        While (Application.OpenForms.Count() = nrOfOpenForms) And (t.IsAlive)
        End While        
        if Not t.IsAlive Then
            log.Error("Thread did not open dialogBox")
            Return
        End If
        'Select preffered button on dialogBox
        Dim isFinished As Boolean = False
        For Each curForm As Form In Application.OpenForms
            For Each btn As Button In curForm.Controls.OfType(Of Button)
                If btn.Name = "Button3" Then
                    btn.PerformClick()
                    isFinished = True
                Exit For
            End If
            Next
            if isFinished Then
                Exit For
            End If
        Next
        'Wait until thread completed Function
        While t.IsAlive
        End While

        Catch ex As Exception        
            log.Error("Thread Error")
        End Try
End Sub

我还没有找到在控制台应用程序中使用Control.Invoke()的方法,因为这是因为它没有被使用。 我可以让我的代码完全执行的方法是禁用我试图避免的CheckForIllegalCrossThreadCalls

是否可以在不使用多个线程的情况下解决访问DialogBox的问题?如果没有,是否可以通过调用suball来解决问题?

修改 我的一些描述可能缺乏详细信息。 我的问题是我的应用程序运行了一个方法showHiddenDialogBox(),它在一个类中运行一组指令,这些指令不在我的代码范围内。这个不可访问的类在执行所有功能时显示一个表单。当显示此表单时,应用程序暂停所有代码执行,直到用户提升输入。 这使得必须使用多个线程来绕过。但是,当显示所有内容时,这个新线程将拥有此表单。这包含在我需要其他线程访问的按钮中。

1 个答案:

答案 0 :(得分:0)

不要使用“CheckForIllegalCrossThreadCalls”,只需使用以下代码调用控件:

'Insert this in a module
<Runtime.CompilerServices.Extension()>
Public Sub InvokeCustom(ByVal Control As Control, ByVal Action As Action)
    If Control.InvokeRequired Then Control.Invoke(New MethodInvoker(Sub() Action()), Nothing) Else Action.Invoke()
End Sub

为线程中的每个控件调用此子

textbox1.InvokeCustom(sub() textbox1.text = "abc")