国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

解決 .NET Core 中 GetHostAddressesAsync 引起的 EnyimMemcached 死鎖問題

2024-07-10 12:49:39
字體:
供稿:網(wǎng)友

在我們將站點從 ASP.NET + Windows 遷移至 ASP.NET Core + Linux 的過程中,目前遇到的最大障礙就是 —— 沒有可用的支持 .NET Core 的 memcached 客戶端。

我們一直用的是 EnyimMemcached ,在沒有其它選擇的情況下,我們自己嘗試著將 EnyimMemcached 遷移至 .NET Core。。。基于 .NET Core 修改好了代碼,在開發(fā)環(huán)境下測試通過,在 Linux 服務(wù)器上自己訪問很正常(沒有并發(fā)訪問量),但是只要接入一定的訪問量就會發(fā)生死鎖(deadlock),瀏覽器請求卡死。

這個問題困擾了我們很長時間,昨天才定位到是發(fā)生在將 memcached 服務(wù)器名稱解析為 IP 地址的時候。

var addresses = System.Net.Dns.GetHostAddressesAsync(host).Result;

這是我們在將 EnyimMemcached 遷移至 .NET Core 時修改過的代碼,之前調(diào)用的是同步方法:

var addresses = System.Net.Dns.GetHostEntry(host);

由于在 .NET Core Framework 的 System.Net.Dns 中沒有同步方法,只有異步方法,所以我們只能這樣調(diào)用異步方法。

看到上面的代碼,你也許會詫異:怎么用 .Result ,為什么不用 await ?不死鎖才怪呢。。。

你的詫異非常正確。我們也深知 .Result 的危害,在平時的代碼中堅決不用。但當(dāng)時在修改 EnyimMemcached 的代碼時,由于這個方法是在 MemcachedClient 的構(gòu)造函數(shù)中調(diào)用的,沒法改為 await 調(diào)用,被迫用了 .Result ,然后又把這個地方的修改給忘了。。。昨天才剛剛發(fā)現(xiàn),立馬意識到罪魁禍?zhǔn)追浅S锌赡芫褪沁@里的 .Result ,于是以此為突破口,想盡一切辦法實現(xiàn)在同步方法中調(diào)用異步辦法,并且在博問中尋求支援 —— 在同步方法中調(diào)用異步方法時如何避免死鎖問題 。

結(jié)果,用盡一切能想到與能找到的同步方法調(diào)用異步方法的方法,都沒能解決死鎖問題。如果實在找不到解決方法,我們準(zhǔn)備采用最后一招也是最丑陋的一招 —— 不用 Dns.GetHostAddressesAsync() ,用 ProcessStartInfo 調(diào)用命令行命令解析 IP ,比如在 Linux 上用 getent hosts 主機(jī)名 。

在準(zhǔn)備放棄之前,今天又想了想還有哪些可能帶來線索的地方漏掉了呢?突然想到有個重要地方竟然忘了,還沒看 Dns.GetHostAddressesAsync() 的源代碼實現(xiàn)。雖然不報太大希望,不就是個異步方法嗎,但還是要看一下。

于是從 github 上簽出 corefx 的源代碼,打開 Dns.GetHostAddressesAsync() 源代碼一看,感覺有點怪怪的,怎么用了 Task.Factory.FromAsync() ?

public static Task<IPAddress[]> GetHostAddressesAsync(string hostNameOrAddress){  NameResolutionPal.EnsureSocketsAreInitialized();  return Task<IPAddress[]>.Factory.FromAsync(    (arg, requestCallback, stateObject) => BeginGetHostAddresses(arg, requestCallback, stateObject),    asyncResult => EndGetHostAddresses(asyncResult),    hostNameOrAddress,    null);}            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 高唐县| 雷山县| 泾川县| 岳阳县| 昌宁县| 维西| 荆门市| 沭阳县| 西乡县| 珲春市| 白玉县| 武乡县| 龙井市| 开鲁县| 当雄县| 盘山县| 远安县| 双桥区| 大荔县| 多伦县| 贵港市| 伊春市| 靖边县| 塔城市| 沙河市| 肥东县| 江都市| 桑植县| 青神县| 临颍县| 阿拉善左旗| 讷河市| 磐石市| 铁岭市| 平昌县| 宁晋县| 左权县| 乡宁县| 定远县| 阿巴嘎旗| 安阳市|