2010-03-29 102 views
0

我有一个应用程序,它具有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 

我意识到,基于将是更容易的形式与也许只是调用不同的形式来处理processes.But我真的没有这个选项,因为现在的控制台应用程序稍后将加入到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

请描述什么是“工作不正常”,其实就是 – 2010-03-29 14:52:21

回答

1

因为你没有描述什么“不正常”的手段,我不能提供一个实际的解决方案。我可以,但是,给些建议:

  1. 如果你的工艺之一是互动的,似乎是一个很好的候选人在一个控制台应用程序中的异步操作不。虽然WinForms或WPF应用程序可以提供用于与此进程交互的专用窗体,但您的控制台窗口无法提供相同类型的隔离。
  2. 您是否有使用STA线程进行操作1的原因?
  3. 对于操作1,您为什么将IsBackground设置为true?后台线程不会阻止进程退出,因此如果进程在线程正在进行时退出,它将简单地终止线程而无需等待它完成。
+0

对不起,缺乏明确的...我线程1设置为STA,因为我是。在主线程以外的线程上使用openfiledialog时出现错误我添加背景是真的,因为别人在另一个论坛上提出这个问题当我运行prgm并选择1时,进程不会调用openfiledialog,它位于loadfile过程,而是通过输入选项再次调用菜单;我选择选项2执行它具有的功能,并在完成过程结束后没有任何反应... prgm冻结 – vbNewbie 2010-03-29 15:08:38

+0

也我将在稍后添加表单,但现在我我需要拥有核心首先工作 – vbNewbie 2010-03-29 15:09:34

+0

@vbNewbie:解释它;如果您使用Windows窗体控件,则必须位于STA线程上。也许发布你的两个线程函数的代码会很有帮助。至于“核心工作第一”,它不是一个从控制台到Windows窗体的常用(或简单)路径。从一个非常基本的Windows Forms应用程序开始,这种应用程序要做的并不多,并且建立在此基础之上,而不是尝试实现控制台应用程序的状态机架构,然后转移到Windows窗体应用程序的基于事件的体系结构,这会更容易。 – 2010-03-29 15:16:29

1

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

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

这里有一个想法:

1)创建一个布尔变量MyThreadRunning

2)如果MyThreadRunning = true时,不显示该线程

3)线程的方法里面的菜单选项,当它完成工作时,将MyThreadRunning设置为false

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

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

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

+0

非常感谢您的回复,请稍等片刻 – vbNewbie 2010-03-29 15:11:00

+0

您可以发布一个样例。不知道这是如何帮助线程不会失速。 – vbNewbie 2010-03-29 15:33:58