Threading.Timer应用程序占用CPU的50%以上,为什么?

时间:2011-03-02 19:59:04

标签: vb.net windows-services console-application visual-studio-2003 timertask

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

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

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

如何让它消耗更少的CPU?

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

稍后我想使用相同的任务创建一个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

谢谢..

4 个答案:

答案 0 :(得分:2)

While Not tmr Is Nothing
End While

在之前的一个问题中,您已经被警告过了。删除该代码。

答案 1 :(得分:2)

While Not tmr Is Nothing
End While

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

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

答案 2 :(得分:2)

我猜你有两个CPU?无限while循环占用一个CPU的100%;让你的CPU总消耗量为50%。

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

删除while循环...

While Not tmr Is Nothing 
End While

使用类似Console.Readline的东西来阻止应用程序关闭。

如果你真的喜欢循环,或者在while循环中粘贴一个thread.sleep()调用。

答案 3 :(得分:1)

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

您可以使用Console.ReadLine()来保持控制台应用程序的运行,而不是无限循环。

当控制台正在等待输入时,您的计时器仍将按预期运行。