如何确保 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的主要原因是在并发量大的时候节省线程。

你问这些东西在什么线程上运行。这无关紧要,但答案是:在某个线程池线程上。