我的应用程序有一个控制台菜单,有2/3选项。一个过程涉及上传文件并对其内容执行冗长的搜索过程,而另一个过程涉及SQL查询,并且是与用户的交互过程。我希望使用线程允许一个进程运行,菜单提供第二个进程运行的选项。但是,您无法运行第一个进程两次。 我已创建线程并更正了一些编译错误,但线程选项无法正常工作。任何帮助表示赞赏。
main...
Dim tm As Thread = New Thread(AddressOf loadFile)
Dim ts As Thread = New Thread(AddressOf reports)
....
While Not response.Equals("3")
Try
Console.Write("Enter choice: ")
response = Console.ReadLine()
Console.WriteLine()
If response.Equals("1") Then
Console.WriteLine("Thread 1 doing work")
tm.SetApartmentState(ApartmentState.STA)
tm.IsBackground = True
tm.Start()
response = String.Empty
ElseIf response.Equals("2") Then
Console.WriteLine("Starting a second Thread")
ts.Start()
response = String.Empty
End If
ts.Join()
tm.Join()
Catch ex As Exception
errormessage = ex.Message
End Try
End While
我意识到基于表单将更容易实现,可能只是调用不同的表单来处理进程。但我现在真的没有这个选项,因为控制台应用程序将在以后添加到api。但这是菜单功能的两个过程。还不知道如何再次使用布尔变量,如下所示。
Private Sub LoadFile()
Dim dialog As New OpenFileDialog
Dim response1 As String = Nothing
Dim filepath As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
dialog.InitialDirectory = filepath
If dialog.ShowDialog() = DialogResult.OK Then
fileName = dialog.FileName
ElseIf DialogResult.Cancel Then
Exit Sub
End If
Console.ResetColor()
Console.Write("Begin Search -- Discovery Search, y or n? ")
response1 = Console.ReadLine()
If response1 = "y" Then
Search()
ElseIf response1 = "n" Then
Console.Clear()
main()
End If
isRunning = False
End Sub
和第二个
Private Shared Sub report()
Dim rptGen As New SearchBlogDiscovery.rptGeneration
Console.WriteLine("Tread Process started")
rptGen.main()
Console.WriteLine("Thread Process ended")
isRunning = False
End Sub
答案 0 :(得分:1)
因为您没有描述“工作不正常”的含义,所以我无法提供实际的解决方案。但是,我可以提出一些建议:
IsBackground
设置为true?后台线程不会阻止进程退出,因此如果进程在线程正在进行时退出,它将直接终止线程而不等待它完成。答案 1 :(得分:1)
Join方法等待线程完成。这意味着选择哪个菜单项并不重要,它总是等到它完成后再选择另一个菜单选项。
“IsBackground”属性只告诉操作系统,如果主线程关闭,后台线程会自动关闭。
这是一个想法:
1)创建一个布尔变量MyThreadRunning
2)如果MyThreadRunning = true,则不显示该线程的菜单选项
3)在线程方法内部,当它完成工作时,将MyThreadRunning设置为false
4)当您选择启动线程的菜单选项时,将MyThreadRunning变量设置为true并启动该线程。
当然,您需要为多个线程使用不同的变量(或数组)。并在变量或锁定机制上使用volatile关键字。
编辑:我真的需要在发布之前观看预览:(