<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網 責編:小采 時間:2020-11-27 22:36:30
        文檔

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

        解決 .NET Core 中 GetHostAddressesAsync 引起的 EnyimMemcached 死鎖問題:在我們將站點從 ASP.NET + Windows 遷移至 ASP.NET Core + Linux 的過程中,目前遇到的最大障礙就是 —— 沒有可用的支持 .NET Core 的 memcached 客戶端。 我們一直用的是 EnyimMemcached ,在沒有其它選擇的情況下,我們自己嘗試著將 Enyim
        推薦度:
        導讀解決 .NET Core 中 GetHostAddressesAsync 引起的 EnyimMemcached 死鎖問題:在我們將站點從 ASP.NET + Windows 遷移至 ASP.NET Core + Linux 的過程中,目前遇到的最大障礙就是 —— 沒有可用的支持 .NET Core 的 memcached 客戶端。 我們一直用的是 EnyimMemcached ,在沒有其它選擇的情況下,我們自己嘗試著將 Enyim

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

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

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

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

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

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

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

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

        你的詫異非常正確。我們也深知 .Result 的危害,在平時的代碼中堅決不用。但當時在修改 EnyimMemcached 的代碼時,由于這個方法是在 MemcachedClient 的構造函數中調用的,沒法改為 await 調用,被迫用了 .Result ,然后又把這個地方的修改給忘了。。昨天才剛剛發現,立馬意識到罪魁禍首非常有可能就是這里的 .Result ,于是以此為突破口,想盡一切辦法實現在同步方法中調用異步辦法,并且在博問中尋求支援 —— 在同步方法中調用異步方法時如何避免死鎖問題 。

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

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

        于是從 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);
        }
        

        開始沒反應過來,只是把這段代碼貼到博問的補充問題中,在貼完后突然反應過來了,咦,怎么沒有 async 關鍵字?方法名最后是 Async,我們一直以為是 async 方法,而且絲毫沒有懷疑過。。

        沒有 async ,只是返回參數是 Task 類型,那在同步方法中調用完全沒問題,只要在訪問 .Result 之前調用一下 .Wait() 方法就行了,于是改為下面的代碼:

        Task<IPAddress[]> task = System.Net.Dns.GetHostAddressesAsync(host);
        task.Wait();
        var addresses = task.Result;

        死鎖問題立馬解決!

        方法名以 Async 結尾,卻不是 async 方法,當時的感想就是 —— 你的眼睛背叛你的心。如果不是我自己的誤解(只要以 Async 結尾,就應該是 async 方法),那就是一種流氓行為,就如 HttpClient 的流氓 —— 實現了 IDispose 接口,卻沒真正 Dispose 。

        不管怎么樣,這個影響我們遷移至 .NET Core 的最大障礙終于消除了,值得慶祝!

        支持 .NET Core 的 EnyimMemcached 的代碼還需要一些修改與完善,等修改好了,我們會把源代碼與 NuGet 包都發布出來。

        通過此文希望能幫助到你解決這種問題,謝謝大家對本站的支持!

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        解決 .NET Core 中 GetHostAddressesAsync 引起的 EnyimMemcached 死鎖問題:在我們將站點從 ASP.NET + Windows 遷移至 ASP.NET Core + Linux 的過程中,目前遇到的最大障礙就是 —— 沒有可用的支持 .NET Core 的 memcached 客戶端。 我們一直用的是 EnyimMemcached ,在沒有其它選擇的情況下,我們自己嘗試著將 Enyim
        推薦度:
        標簽: 解決 net 引起的
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久精品蜜芽亚洲国产AV| 亚洲精品无码成人片在线观看 | 亚洲国产精品无码久久久秋霞2| 国产亚洲男人的天堂在线观看| 啦啦啦www免费视频| 亚洲一区二区三区高清在线观看| 免费AA片少妇人AA片直播| 亚洲AV无码乱码在线观看代蜜桃| 国产成人精品久久免费动漫| 亚洲国产成人精品无码区在线秒播 | 亚洲阿v天堂在线2017免费| 亚洲日韩中文字幕日韩在线| 一区二区三区在线免费| 国产亚洲美日韩AV中文字幕无码成人 | 亚洲一区二区三区免费| 久久久WWW免费人成精品| 久久亚洲精品中文字幕无码| 免费在线观看视频网站| 亚洲色欲色欱wwW在线| 国产免费无遮挡精品视频| 久久国产免费直播| 亚洲综合在线视频| 91在线视频免费播放| 另类小说亚洲色图| 国产亚洲色婷婷久久99精品| 日本免费一区二区三区四区五六区| 亚洲第一页中文字幕| 日韩免费视频一区| www免费黄色网| 99亚洲精品高清一二区| 啦啦啦中文在线观看电视剧免费版| 亚洲GV天堂GV无码男同| 国产亚洲精品观看91在线| 我们的2018在线观看免费高清 | 一本久久免费视频| 亚洲无删减国产精品一区| 午夜免费不卡毛片完整版| 中文字幕乱码系列免费| 亚洲乱码无限2021芒果| 亚洲免费在线观看| 少妇高潮太爽了在线观看免费|