在菜单选项中使用线程

时间:2010-03-29 14:48:09

标签: vb.net visual-studio-2008

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

2 个答案:

答案 0 :(得分:1)

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

  1. 如果您的某个进程是交互式的,那么它似乎不适合在控制台应用程序中进行异步操作。虽然WinForms或WPF应用程序可以提供与此进程交互的专用表单,但您的控制台窗口无法提供相同的隔离。
  2. 您是否有使用STA线程进行操作1的原因?
  3. 同样对于操作1,为什么要将IsBackground设置为true?后台线程不会阻止进程退出,因此如果进程在线程正在进行时退出,它将直接终止线程而不等待它完成。

答案 1 :(得分:1)

Join方法等待线程完成。这意味着选择哪个菜单项并不重要,它总是等到它完成后再选择另一个菜单选项。

“IsBackground”属性只告诉操作系统,如果主线程关闭,后台线程会自动关闭。

这是一个想法:

1)创建一个布尔变量MyThreadRunning

2)如果MyThreadRunning = true,则不显示该线程的菜单选项

3)在线程方法内部,当它完成工作时,将MyThreadRunning设置为false

4)当您选择启动线程的菜单选项时,将MyThreadRunning变量设置为true并启动该线程。

当然,您需要为多个线程使用不同的变量(或数组)。并在变量或锁定机制上使用volatile关键字。

编辑:我真的需要在发布之前观看预览:(