我正在开发 2 个应用程序 - 一个是 Windows 服务,它执行后台任务和 api 调用等。
第二个是在用户上下文中运行的表单应用程序。表单应用程序的目的是在 Windows 服务需要时向用户显示数据。
为了启用两个应用程序之间的通信,我使用了线程和套接字。
我以前没有这样做过,所以如果我犯了任何明显的错误,请放轻松。
两个应用程序中的代码几乎如下所示,除了每个应用程序的端口号不同......
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
两个应用程序之间的通信工作正常,在这两种情况下,“消息”都会传递到 ResponseCalc 函数,该函数确定两端需要执行的操作。
问题是,自从放入这个之后,我的两个应用程序都使用了大量的 CPU。
以至于我的机器的 CPU 利用率不断达到 100%。
有没有一种方法可以实现相同的结果而不需要相应的疯狂的 CPU 使用率?
或者如果做不到这一点,您还可以如何在这样的应用程序之间启用通信?
最初我正在考虑向磁盘写入/读取文件,但不想这样做,因为感觉很草率和业余。
任何帮助将不胜感激!
问题在于你的StartListener
函数,它执行双重任务,作为外部调用的函数来启动侦听器线程,并作为该线程的启动函数。这正在创建无限递归。执行顺序如下所示:
- Call
StartListener
来自其他代码。
-
StartListener
创建一个新线程,其中StartListener
作为启动例程。
-
StartListener
启动新线程。
- 新线程开始运行并运行
StartListener
.
- 循环回到(2)
要解决此问题,启动例程应该不是StartListener
。我不确定您是否真的需要线程执行除了托管套接字处理的某些方面之外的任何操作;如果它只是需要存在,那么启动例程可以像空白一样简单Sub
。否则,您可以内联编写它或者您可以使用AddressOf
具有单独编写的例程。
或者,换句话说,您似乎根本不需要编写自己的线程,正如您的评论所暗示的那样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)