亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何取消 Socket.ReceiveFromAsync()?

如何取消 Socket.ReceiveFromAsync()?

C#
拉丁的傳說 2022-10-15 15:28:31
我正在使用 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.Delaywith Task.WhenAny,您的擔憂是完全正確的。Task.Delay+Task.WhenAny方法只取消操作的等待,而不是操作本身。具體來說,它不會取消 UDP 接收,并且未取消的 UDP 接收操作可能會獲得一個隨后會“丟失”的數據包,因為您的應用程序會忽略它。


查看完整回答
反對 回復 2022-10-15
  • 1 回答
  • 0 關注
  • 109 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號