亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解決 .NET Core 中 GetHostAddressesAsync 引起的 EnyimMemcached 死鎖問(wèn)題

 更新時(shí)間:2016年09月22日 09:43:38   作者:dudu  
這篇文章主要介紹了解決 .NET Core 中 GetHostAddressesAsync 引起的 EnyimMemcached 死鎖問(wèn)題的相關(guān)資料,需要的朋友可以參考下

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

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

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

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

這是我們?cè)趯?EnyimMemcached 遷移至 .NET Core 時(shí)修改過(guò)的代碼,之前調(diào)用的是同步方法:

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

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

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

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

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

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

于是從 github 上簽出 corefx 的源代碼,打開(kāi) Dns.GetHostAddressesAsync() 源代碼一看,感覺(jué)有點(diǎn)怪怪的,怎么用了 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);
}

開(kāi)始沒(méi)反應(yīng)過(guò)來(lái),只是把這段代碼貼到博問(wèn)的補(bǔ)充問(wèn)題中,在貼完后突然反應(yīng)過(guò)來(lái)了,咦,怎么沒(méi)有 async 關(guān)鍵字?方法名最后是 Async,我們一直以為是 async 方法,而且絲毫沒(méi)有懷疑過(guò)。。。

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

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

死鎖問(wèn)題立馬解決!

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

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

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

通過(guò)此文希望能幫助到你解決這種問(wèn)題,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • .net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC詳解

    .net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC詳解

    這篇文章主要給大家介紹了關(guān)于.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.net core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • DotNet OnPreRender(EventArgs e) 事件常用的方法

    DotNet OnPreRender(EventArgs e) 事件常用的方法

    DotNet OnPreRender(EventArgs e) 事件常用的方法,需要的朋友可以參考下。
    2011-07-07
  • Asp.net實(shí)現(xiàn)選擇性的保留DataTable中的列

    Asp.net實(shí)現(xiàn)選擇性的保留DataTable中的列

    選擇性的保留DataTable中的列(移除列/保留列不移除/移除不需要的列),很多新手朋友們都想實(shí)現(xiàn)這樣的功能,本文總結(jié)了一些可行方法,感興趣的朋友可以了解下哦
    2013-01-01
  • 學(xué)習(xí)制作MVC4分頁(yè)控件(上)

    學(xué)習(xí)制作MVC4分頁(yè)控件(上)

    這篇文章主要教大家學(xué)習(xí)制作MVC4分頁(yè)控件,自己動(dòng)手編寫HtmlHelper-Pager分頁(yè)控件,感興趣的小伙伴們可以參考一下
    2016-08-08
  • .NET6中使用CuteEditor詳解

    .NET6中使用CuteEditor詳解

    本文詳細(xì)講解了.NET6中使用CuteEditor的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 批量刪除記錄時(shí)如何實(shí)現(xiàn)全選方法總結(jié)

    批量刪除記錄時(shí)如何實(shí)現(xiàn)全選方法總結(jié)

    批量刪除記錄時(shí)如何實(shí)現(xiàn)全選方法總結(jié)...
    2007-04-04
  • ASP.NET自定義Web服務(wù)器控件之Button控件

    ASP.NET自定義Web服務(wù)器控件之Button控件

    這篇文章主要介紹了ASP.NET自定義Web服務(wù)器控件之Button控件,詳細(xì)講述了Button控件的實(shí)現(xiàn)代碼、前臺(tái)頁(yè)面的調(diào)用以及對(duì)應(yīng)的事件響應(yīng)代碼,具有很好的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • 詳解如何在ASP.NET Core中應(yīng)用Entity Framework

    詳解如何在ASP.NET Core中應(yīng)用Entity Framework

    本篇文章主要介紹了如何在ASP.NET Core中應(yīng)用Entity Framework,具有一定的參考價(jià)值,有興趣的可以一起了解一下。
    2016-12-12
  • asp.net窗體操作總結(jié)

    asp.net窗體操作總結(jié)

    這些代碼全部寫在和頁(yè)面分離的代碼頁(yè)中(codebehind),如果要嵌入到*.aspx頁(yè)面,可能會(huì)出現(xiàn)問(wèn)題.
    2008-11-11
  • gojs一些實(shí)用的高級(jí)用法

    gojs一些實(shí)用的高級(jí)用法

    gojs是一個(gè)非常強(qiáng)大的可視化關(guān)系的js庫(kù)。本文介紹的是在使用gojs制作圖的過(guò)程中,你可能會(huì)碰到的問(wèn)題的一些解決方案。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01

最新評(píng)論