Threading.Timer 应用程序消耗超过 50% 的 CPU,为啥?

Posted

技术标签:

【中文标题】Threading.Timer 应用程序消耗超过 50% 的 CPU,为啥?【英文标题】:Threading.Timer application is consuming more than 50% of CPU, why?Threading.Timer 应用程序消耗超过 50% 的 CPU,为什么? 【发布时间】:2011-03-02 19:59:03 【问题描述】:

我在 VB.net 中编写了以下控制台应用程序。

我的目的是编写一个每分钟触发一次并执行某些任务的应用程序。但是

当我运行这个应用程序时,它消耗了 50% 的 CPU。

我怎样才能让它消耗更少的CPU?

我是否在正确的位置调用计时器(在 main 方法中)?

稍后我想创建一个具有相同任务的 Windows 服务并安装在服务器上。

如何让应用程序消耗更少的 CPU?

Module Module1

    Dim inputPath As String = "C:\Input"
    Dim outputPath As String = "C:\Output"
    Dim folder As Directory

    Sub Main()
        Dim tmr As Timer = New Timer(New TimerCallback(AddressOf Upload), Nothing, 1000, 60000)
        While Not tmr Is Nothing
        End While

    End Sub

    Public Sub Upload(ByVal o As Object)
        Dim sr As StreamReader
        Dim conStr1 As String = "Data Source=TNS Name;User ID=xx; Password=xx;"
        'Look up for pending requests in RQST_TBL
        Dim cnn1 As New OracleConnection(conStr1)
        Dim datReader As OracleDataReader
        Dim cmd1 As New OracleCommand
        cnn1.Open()
        .....
        .....
    End Sub

End Module

谢谢你..

【问题讨论】:

【参考方案1】:

我猜你有两个 CPU?无限的while循环消耗了100%的CPU;使您的 CPU 消耗总量减少 50%。

从您的代码的外观 - 循环是完全不需要的。您的计时器类将在完成后调用 Upload() 方法。

删除while循环...

While Not tmr Is Nothing 
End While

并使用 Console.Readline 之类的东西来防止应用程序关闭。

如果你真的喜欢循环,也可以在 while 循环中添加一个 thread.sleep() 调用。

【讨论】:

谢谢。我这样做了,它不会给 CPU 带来任何负担。【参考方案2】:
While Not tmr Is Nothing
End While

您已经在上一个问题中被警告过。删除该代码。

【讨论】:

我在 while 循环中添加了 Thread.Sleep(60000),它几乎占用了 0% 的 CPU。非常感谢。很抱歉我错过了之前的警告..【参考方案3】:
While Not tmr Is Nothing
End While

这只是一个无限循环。你实际上并没有允许任何事情完成。

由于这是一个控制台应用程序,您可能只需要一个循环休眠一分钟,然后执行您的任务。

【讨论】:

【参考方案4】:

正如 Rob 所说,50% 的负载可能意味着您正在使用 100% 的 CPU 内核之一。

您可以使用Console.ReadLine() 代替无限循环来保持控制台应用程序运行。

在控制台等待输入时,您的计时器仍会按您的预期工作。

【讨论】:

以上是关于Threading.Timer 应用程序消耗超过 50% 的 CPU,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

当处理程序调用 http 端点时,System.Threading.Timer 不会触发

Windows.Forms.Timer或System.Threading.Timer

System.Timers.Timer 与 System.Threading.Timer

Compact Framework - System.Threading.Timer 在用户关闭屏幕时停止

为啥 System.Timers.Timer 能在 GC 中存活,而 System.Threading.Timer 不能?

csharp 定期从Topshelf Windows服务调用多个处理程序(使用System.Threading.Timer)