我正在使用 dotnet core 2.2 并具有以下 UDP 偵聽器:var socket = new Socket(ep.AddressFamily, SocketType.Dgram, ProtocolType.Udp);while (true){ var result = await socket.ReceiveFromAsync(...);}現在在某些情況下,我想中斷ReceiveFromAsync()通話。但似乎與 TCP 案例(即ReceiveAsync())不同,沒有ReceiveFromAsync()接受過載CancellationToken。一種選擇是與Task.Delay(-1, ct);一起使用Task.WhenAny()/Task.WhenAll()。但我認為這個解決方案會導致內存泄漏,對吧?我的意思是.ReceiveFromAsync()如果被打斷,呼叫仍然“存在”,只是在后臺。也可能導致邏輯中斷,因為這樣的調用會讀取一個 UDP 數據包并在之后丟棄它?還是我的推理不正確?另一個想法是讓后臺工作人員從 UDP 套接字讀取數據并對每個數據包進行排隊。并且這里不會發生中斷。然后我會從隊列中讀取并中斷這個呼叫。這會奏效,但肯定需要一些努力。我看到的問題是:線程安全和性能。有沒有更清潔/更簡單的方法來處理這種情況?
1 回答

墨色風雨
TA貢獻1853條經驗 獲得超6個贊
對于“不可取消”的 I/O 請求,Windows 中的標準模式是關閉底層句柄——在本例中為套接字。這通常會導致任何異步(或同步)操作以錯誤代碼完成。
在您的情況下-“暫?!?UDP 接收器-我認為這種方法特別有意義。無論如何,UDP 套接字并不代表打開的連接,因此關閉套接字是最好的解決方案。
關于Task.Delay
with Task.WhenAny
,您的擔憂是完全正確的。Task.Delay
+Task.WhenAny
方法只取消操作的等待,而不是操作本身。具體來說,它不會取消 UDP 接收,并且未取消的 UDP 接收操作可能會獲得一個隨后會“丟失”的數據包,因為您的應用程序會忽略它。
- 1 回答
- 0 關注
- 109 瀏覽
添加回答
舉報
0/150
提交
取消