2014-05-21 79 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.它允许通过与上面所示相同的方法重用线程。

相关问题