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

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