Vb.net 在菜单选项中使用线程

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

我有一个应用程序,有一个控制台菜单和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

因为您没有描述“工作不正常”的含义,所以我无法提供实际的解决方案。不过,我可以提出一些建议:

  • 如果您的一个进程是交互式的,那么在控制台应用程序中,这似乎不适合异步操作。虽然WinForms或WPF应用程序可以提供一个专用的表单来与该进程交互,但您的控制台窗口不能提供相同的隔离
  • 在操作1中使用STA线程有什么原因吗
  • 同样对于操作1,为什么要将
    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,我要试一试,你能发布一个这样做的示例方法吗?不确定这如何帮助线程不失速。