vb. net - приложение службы и приложение форм имеют очень высокую загрузку ЦП с момента добавления порта связи - PullRequest
0 голосов
/ 03 августа 2020

У меня есть 2 приложения, над которыми я работаю - одно из них - это служба windows, которая выполняет фоновые задачи и вызывает API-запросы et c. Второй - это приложение для форм, которое запускается в контексте пользователя. Назначение приложения форм - отображать данные пользователю по мере необходимости, когда это требуется службой windows.

Чтобы включить обмен данными между двумя приложениями, я использовал потоки и сокеты. Я не делал этого раньше, поэтому, пожалуйста, go полегче, если я допустил какие-либо вопиющие ошибки. Код в обоих приложениях выглядит примерно следующим образом, за исключением номера порта, который отличается для каждого ...

 Imports System.Net.Sockets
 Imports System.Threading

Public Listener As New TcpListener(64420)
Public Client As New TcpClient
Public Message As String = ""

 Public Function StartListener()
    Try
        Dim ListenerThread As New Thread(New ThreadStart(AddressOf StartListener))
        ListenerThread.Start()
        Listener.Start()
        Timer1.Start()
    Catch ex As Exception

    End Try
End Function

Public Function MessageClient(ByVal Message As String)
    Try
        Client = New TcpClient("127.0.0.1", 64421)
        Dim Writer As New StreamWriter(Client.GetStream())
        Writer.Write(Message)
        Writer.Flush()
        Return "OK"
    Catch ex As Exception
        Return "Error"
    End Try
End Function

 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    If Listener.Pending = True Then
        Message = ""
        Client = Listener.AcceptTcpClient()

        Dim Reader As New StreamReader(Client.GetStream())
        While Reader.Peek > -1
            Message = Message + Convert.ToChar(Reader.Read()).ToString
        End While
        ResponseCalc(Message)
        End If
    End Sub

Обмен данными между двумя приложениями работает отлично, и в обоих случаях передается «сообщение». на функцию ResponseCal c, которая определяет, что нужно сделать на обоих концах.

Проблема в том, что с тех пор, как я вставил это, оба моих приложения используют безумное количество ЦП. До такой степени, что я постоянно выключаю свою машину на 100% ЦП.

Есть ли способ достичь того же результата без соответствующего сумасшедшего использования ЦП?

Или в противном случае, Как еще вы могли go включить связь между такими приложениями?

Первоначально я думал о записи / чтении файлов на диск и с диска, но не хотел этого делать, так как это было неряшливо и непрофессионально .

Приветствуем любую помощь!

1 Ответ

1 голос
/ 04 августа 2020

Проблема в вашей функции StartListener, которая выполняет двойную функцию: функция, вызываемая извне, для запуска потока слушателя и функция запуска для этого потока. Это создает бесконечную рекурсию. Последовательность выполнения выглядит так:

  1. Вызов StartListener из другого кода.
  2. StartListener создает новый поток с StartListener в качестве процедуры запуска.
  3. StartListener запускает новый поток.
  4. Новый поток запускается и выполняется StartListener.
  5. Вернуться к (2)

To исправьте это, процедура запуска должна отличаться от StartListener. Я не уверен, действительно ли вам нужен поток для чего-либо, кроме выполнения какого-либо аспекта обработки сокета; если он просто должен существовать, то процедура запуска может быть такой же простой, как пустой Sub. В противном случае вы могли бы написать его встроенным или вы могли бы использовать AddressOf с отдельной подпрограммой.

Или, в качестве альтернативы, кажется, что вам может вообще не понадобиться писать свой собственный поток, поскольку ваш комментарий подсказал бы.

...