1

我在 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

4 回答 4

2
While Not tmr Is Nothing
End While

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

于 2011-03-02T20:02:16.080 回答
2
While Not tmr Is Nothing
End While

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

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

于 2011-03-02T20:03:54.733 回答
2

我猜你有两个CPU?无限的while循环消耗了100%的CPU;给你 50% 的总 CPU 消耗。

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

删除while循环...

While Not tmr Is Nothing 
End While

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

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

于 2011-03-02T20:07:19.283 回答
1

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

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

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

于 2011-03-02T20:08:53.323 回答