第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何取消 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(...);}現(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.Delaywith Task.WhenAny,您的擔(dān)憂是完全正確的。Task.Delay+Task.WhenAny方法只取消操作的等待,而不是操作本身。具體來說,它不會(huì)取消 UDP 接收,并且未取消的 UDP 接收操作可能會(huì)獲得一個(gè)隨后會(huì)“丟失”的數(shù)據(jù)包,因?yàn)槟膽?yīng)用程序會(huì)忽略它。


查看完整回答
反對(duì) 回復(fù) 2022-10-15
  • 1 回答
  • 0 關(guān)注
  • 115 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)