Vb.net 在菜单选项中使用线程
我有一个应用程序,有一个控制台菜单和2/3的选择。一个过程涉及上传文件并对其内容执行冗长的搜索过程,而另一个过程涉及SQL查询,是与用户的交互过程。我希望使用线程来允许一个进程运行,并使用菜单来提供第二个进程运行的选项。但是,第一个进程不能运行两次。 我已经创建了线程并更正了一些编译错误,但是线程选项不能正常工作。谢谢你的帮助Vb.net 在菜单选项中使用线程,vb.net,visual-studio-2008,Vb.net,Visual Studio 2008,我有一个应用程序,有一个控制台菜单和2/3的选择。一个过程涉及上传文件并对其内容执行冗长的搜索过程,而另一个过程涉及SQL查询,是与用户的交互过程。我希望使用线程来允许一个进程运行,并使用菜单来提供第二个进程运行的选项。但是,第一个进程不能运行两次。 我已经创建了线程并更正了一些编译错误,但是线程选项不能正常工作。谢谢你的帮助 main... Dim tm As Thread = New Thread(AddressOf loadFile) Dim ts As Thread = New T
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
因为您没有描述“工作不正常”的含义,所以我无法提供实际的解决方案。不过,我可以提出一些建议:
IsBackground
设置为true?后台线程不会阻止进程退出,因此如果进程在线程进行时退出,它只会在不等待线程完成的情况下杀死线程Join方法等待线程完成。这意味着,无论选择了哪个菜单项,它总是等到它完成后,再选择另一个菜单选项 “IsBackground”属性只是告诉操作系统,如果主线程关闭,后台线程将自动关闭 这里有一个想法: 1) 创建一个布尔变量 2) 如果MyThreadRunning=true,则不显示该线程的菜单选项 3) 在线程的方法中,当它完成工作时,将MyThreadRunning设置为false 4) 选择启动线程的菜单选项时,请将MyThreadRunning变量设置为true并启动线程 当然,多个线程需要不同的变量(或数组)。并在变量上使用volatile关键字或锁定机制
编辑:我真的需要在发布前观看预览:(请描述什么“工作不正常”实际上是指。抱歉不够清晰…我将线程1设置为STA,因为在主线程以外的线程上使用openfiledialog时出错。我添加的背景是真实的,因为其他人在另一个论坛上建议这样做。当我运行prgm并选择1时,进程不会调用加载中的openfiledialog文件处理,但通过输入选项再次调用菜单;我选择选项2执行其功能,完成后,过程结束,什么也没有发生…prgm冻结,因此我将稍后添加表单,但现在我需要核心工作first@vbNewbie:这就解释了;如果您使用的是Windows窗体控件l、 它必须在STA线程上。也许发布两个线程函数的代码会有帮助。至于“核心先工作”,这不是一个常见的(或容易的)方法从控制台移动到windows窗体的路径。从一个非常基本的windows窗体应用程序开始并在此基础上进行构建比尝试实现控制台应用程序的状态机体系结构然后移动到windows窗体应用程序的基于事件的体系结构要容易得多。非常感谢您的回复se,我要试一试,你能发布一个这样做的示例方法吗?不确定这如何帮助线程不失速。