Приложение Threading.Timer потребляет более 50% процессорного времени, почему? - PullRequest
1 голос
/ 02 марта 2011

Я написал ниже консольное приложение в VB.net.

Я собираюсь написать приложение, которое запускается каждую минуту, и выполнять какое-то задание. Но

когда я запускаю это приложение, оно потребляет 50% процессора.

Как мне сделать так, чтобы он потреблял меньше ресурсов процессора?

Вызываю ли я таймер в нужном месте (в основном методе)?

Позже я хотел бы сделать службу Windows с этой же задачей и установить на сервер.

Как я могу заставить приложение потреблять меньше ресурсов процессора?

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 ]

2 голосов
/ 02 марта 2011
While Not tmr Is Nothing
End While

Это просто бесконечный цикл.На самом деле вы ничего не позволяете сделать.

Поскольку это консольное приложение, вам, вероятно, нужен только цикл, который спит минуту, а затем выполняет свою задачу.

2 голосов
/ 02 марта 2011

Полагаю, у вас есть два процессора?Бесконечный цикл while потребляет 100% одного процессора;оставляя вам 50% общего потребления процессора.

Судя по виду вашего кода, цикл совершенно не нужен.Ваш класс таймера будет вызывать метод Upload () после его завершения.

Удалить цикл while ...

While Not tmr Is Nothing 
End While

И использовать что-то вроде Console.Readline для сохранения приложенияот закрытия.

Либо вставьте вызов thread.sleep () в цикл while, если вам действительно нравится цикл.

2 голосов
/ 02 марта 2011
While Not tmr Is Nothing
End While

Вы уже были предупреждены об этом в предыдущем вопросе.Удалить этот код.

1 голос
/ 02 марта 2011

Как сказал Роб, 50% -ная нагрузка, вероятно, означает, что вы используете 100% одного из ваших процессорных ядер.

Вместо бесконечного цикла вы можете использовать Console.ReadLine() для поддержания работы консольного приложения..

Пока консоль ожидает ввода, таймер все равно будет работать так, как вы намереваетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...