我目前正在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()
,它在一个类中运行一组指令,这些指令不在我的代码范围内。这个不可访问的类在执行所有功能时显示一个表单。当显示此表单时,应用程序暂停所有代码执行,直到用户提升输入。
这使得必须使用多个线程来绕过。但是,当显示所有内容时,这个新线程将拥有此表单。这包含在我需要其他线程访问的按钮中。
答案 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")