2010-03-29 72 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