2014-05-21 83 views
0

所以我有2個線程在我的應用程序中工作正常,除了他們將繼續佔用相當大量的我的處理器,即使他們關閉或中止後。這就是其中一個循環與一些主要聲明一起的樣子。減少線程的CPU使用率

Dim Thread1 As System.Threading.Thread 
Dim ThreadRunning As Boolean 
Dim Thread1Running As Boolean = False 

Sub Something() 
    While True 
     If ThreadRunning = True Then 
      Try 
       ...Actions which don't necessarily affect the thread 
      Catch ex As Exception 
      End Try 
     ElseIf ThreadRunning = False Then 
      If Thread1Running = True Then 
       Thread1Running = False 
       Thread1.Abort() 
      Else 
      End If 
     End If 
    End While 
End Sub 

這是我用來啓動線程的代碼。

Thread1Running = True 
Dim Thread1 As New System.Threading.Thread(AddressOf Something) 
Thread1.IsBackground = True 
Thread1.Priority = ThreadPriority.Lowest 
Thread1.Start() 

這是我用來停止線程的代碼。

ThreadRunning = False 

線程中的操作需要線程,因爲任務的計時器太慢(即使在1毫秒的時間間隔)。除了當我放棄線程時,這些操作都可以正常執行。在這種情況下,該線程將關閉,並且該程序的CPU使用率將從大約25%降至0%,但隨後會因CLR錯誤而崩潰。當我從子外部中止線程時,它仍將程序CPU使用率保持在25%,這正是我試圖避免的。所以我的主要問題是:是否可以關閉線程並稍後在沒有崩潰的情況下重新打開線程,並且在關閉線程時不會佔用CPU的25%(或某些其他相當高的CPU性能)?如果這沒有足夠的信息,我會提供更多,但我的事情就足夠了......希望。謝謝你的幫助。

+1

[**不要使用'Thread.Abort'!**](http://stackoverflow.com/questions/1559255/whats-wrong-with-using-thread-abort)[它是* evil * ](http://haacked.com/archive/2004/11/12/how-to-stop-a-thread.aspx/)。另外,你正在顯示管理線程的所有代碼,但問題在於線程*實際正在執行的*,這是你沒有顯示的。只是因爲某個線程中的東西並不意味着它會使用更少的CPU - 它只是意味着您的GUI仍然可以正常工作(在這裏)。 'while(1){}'循環仍然會完全消耗一個CPU內核。 –

+0

我明白了。感謝您的快速回復。那麼Thread.Abort有沒有其他選擇?至於代碼,我認爲它不一定會在應用程序關閉時導致應用程序崩潰。退出應用程序時關閉線程也不是問題。主要是線程正在使用這個百分比,而它們不活動或者被認爲是中止/掛起。我試圖找到一種方法來可能暫停他們的CPU使用/運行,直到它再次啓動(我試過Thread.Abort和Thread.Suspend/Resume但都沒有正常工作,或者我用它們錯了)。 – MiKe34123

+0

我認爲這是兩個不同的問題:1)線程CPU使用率(完全依賴於你沒有顯示的代碼,2)'Thread.Abort' /如何退出後臺線程。 –

回答

0

以下是我找到的解決方案。

While True 
     If ThreadRunning = True Then 
      Try 
       ...Code stuff 
      Catch ex As Exception 
      End Try 
     ElseIf ThreadRunning = False Then 
      Exit While 
     End If 
    End While 
Exit Sub 

顯然檢查它的方式使得它1.線程不會掛起。 2.它完全退出線程並阻止其在關閉時使用CPU。 3.它允許通過與上面所示相同的方法重用線程。

相關問題