如何确保 UDPClient Receive Callback 在单独的线程上处理消息?
How do I ensure the UDPClient Receive Callback processes the message on a separate thread?
我想弄清楚如何将 UDPClient 接收回调与接收消息的处理分开。由于传入的 UDP 消息量很大,我们希望将消息的实际处理转移到另一个线程,希望减轻 UDP 客户端的负担并且不会错过任何传入的消息。 (200 条消息/秒)
AsyncCallBack 发生在 UDPClient 所在的同一线程上还是新线程上?如果它在同一个线程上,那么如果我在回调中创建一个新线程,我将为每条消息创建一个单独的线程,这是行不通的。
如果 AsyncCallback 与连接在同一个线程上,那么我的想法是我必须在建立连接之前以某种方式创建一个线程,然后为收到的每条消息调用该线程上的某些内容?
Private Sub OpenConnection()
_ipendpoint = New IPEndPoint(IPAddress.Any, _configobj.port)
_udpclient = New UdpClient(_ipendpoint)
_udpclient.BeginReceive(New AsyncCallback(AddressOf ReceiveCallback), Nothing)
End Sub
Private Sub ReceiveCallback(ar As IAsyncResult)
Dim bytes As Byte() = _udpclient.EndReceive(ar, _ipendpoint)
_udpclient.BeginReceive(New AsyncCallback(AddressOf ReceiveCallback), Nothing)
ProcessReceived(bytes)
End Sub
Private Sub ProcessReceived(bytes() As Byte)
Dim rcv As String = Encoding.ASCII.GetString(bytes).Trim()
'PROCESS MESSAGE ON DIFFERENT THREAD
End Sub
你有点把事情复杂化了。每秒 200 条消息算不了什么。
首先你需要一个阅读循环:
while (true) {
var result = udpClient.Receive(...);
Task.Run(() => ProcessPacketAsync(result));
}
仅此而已。您需要实施 ProcessPacketAsync
。根据您需要使用异步 IO 的功能。通常,同步 IO 就足够了。使用async IO的主要原因是在并发量大的时候节省线程。
你问这些东西在什么线程上运行。这无关紧要,但答案是:在某个线程池线程上。
我想弄清楚如何将 UDPClient 接收回调与接收消息的处理分开。由于传入的 UDP 消息量很大,我们希望将消息的实际处理转移到另一个线程,希望减轻 UDP 客户端的负担并且不会错过任何传入的消息。 (200 条消息/秒)
AsyncCallBack 发生在 UDPClient 所在的同一线程上还是新线程上?如果它在同一个线程上,那么如果我在回调中创建一个新线程,我将为每条消息创建一个单独的线程,这是行不通的。 如果 AsyncCallback 与连接在同一个线程上,那么我的想法是我必须在建立连接之前以某种方式创建一个线程,然后为收到的每条消息调用该线程上的某些内容?
Private Sub OpenConnection()
_ipendpoint = New IPEndPoint(IPAddress.Any, _configobj.port)
_udpclient = New UdpClient(_ipendpoint)
_udpclient.BeginReceive(New AsyncCallback(AddressOf ReceiveCallback), Nothing)
End Sub
Private Sub ReceiveCallback(ar As IAsyncResult)
Dim bytes As Byte() = _udpclient.EndReceive(ar, _ipendpoint)
_udpclient.BeginReceive(New AsyncCallback(AddressOf ReceiveCallback), Nothing)
ProcessReceived(bytes)
End Sub
Private Sub ProcessReceived(bytes() As Byte)
Dim rcv As String = Encoding.ASCII.GetString(bytes).Trim()
'PROCESS MESSAGE ON DIFFERENT THREAD
End Sub
你有点把事情复杂化了。每秒 200 条消息算不了什么。
首先你需要一个阅读循环:
while (true) {
var result = udpClient.Receive(...);
Task.Run(() => ProcessPacketAsync(result));
}
仅此而已。您需要实施 ProcessPacketAsync
。根据您需要使用异步 IO 的功能。通常,同步 IO 就足够了。使用async IO的主要原因是在并发量大的时候节省线程。
你问这些东西在什么线程上运行。这无关紧要,但答案是:在某个线程池线程上。