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

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

為什么 HTTP 請(qǐng)求永遠(yuǎn)不會(huì)以異步等待返回?

為什么 HTTP 請(qǐng)求永遠(yuǎn)不會(huì)以異步等待返回?

C#
素胚勾勒不出你 2021-11-21 15:49:41
我正在嘗試從在 IIS 8.5 上運(yùn)行的 ASP.NET 應(yīng)用程序中對(duì)另一臺(tái)服務(wù)器進(jìn)行 HTTP 調(diào)用。首先,我從 Microsoft 的一篇文章Call a Web API From a .NET Client (C#) 中得到了一些提示。我可以很容易地看到他們?nèi)绾卧谀抢镞M(jìn)行 HTTP 調(diào)用的模式;僅顯示一個(gè)縮短的示例:    static async Task<Product> GetProductAsync(string path)    {        HttpResponseMessage response = await client.GetAsync(path);        if (response.IsSuccessStatusCode)        {            // retrieve response payload            ... = await response.Content.ReadAsAsync<...>();        }        // do something with data    }很簡(jiǎn)單,我想,所以我很快為我的應(yīng)用程序編寫了一個(gè)類似的方法(請(qǐng)注意,ReadAsAsync擴(kuò)展方法似乎需要一個(gè)額外的庫(kù),所以我選擇了一個(gè)內(nèi)置的、更抽象的,但在其他方面可能是類似的方法):    private async Task<MyInfo> RetrieveMyInfoAsync(String url)    {        var response = await HttpClient.GetAsync(url);        response.EnsureSuccessStatusCode();        var responseBody = await response.Content.ReadAsStringAsync();        return JsonConvert.DeserializeObject<MyInfo>(responseBody);    }不幸的是,調(diào)用此方法會(huì)導(dǎo)致我的應(yīng)用程序掛起。調(diào)試時(shí),事實(shí)證明await調(diào)用GetAsync永遠(yuǎn)不會(huì)返回。摸索了一會(huì)兒后,我碰上了一個(gè)遙控類似的問題,在其評(píng)論部分,我發(fā)現(xiàn)一個(gè)很有意思的建議,通過(guò)B君:刪除所有異步內(nèi)容并確保它有效。所以我試了一下:    private Task<MyInfo> RetrieveMyInfoAsync(String url)    {        return HttpClient.GetAsync(url).ContinueWith(response =>        {            response.Result.EnsureSuccessStatusCode();            return response.Result.Content.ReadAsStringAsync();        }).ContinueWith(str => JsonConvert.DeserializeObject<MyInfo>(str.Result.Result));    }有點(diǎn)令人驚訝(對(duì)我來(lái)說(shuō)),這是有效的。 GetAsync在不到一秒的時(shí)間內(nèi)返回來(lái)自其他服務(wù)器的預(yù)期響應(yīng)?,F(xiàn)在,同時(shí)使用 AngularJS,我對(duì)response.Result.Content和 之類的東西感到有點(diǎn)失望str.Result.Result。在 AngularJS 中,我希望上面的調(diào)用只是類似于:$http.get(url).then(function (response) {    return response.data;});即使我們不考慮 JavaScript 中發(fā)生的自動(dòng) JSON 反序列化,AngularJS 代碼仍然更容易,因?yàn)?egresponse沒有被包裝成一個(gè)承諾或類似的東西,我也不會(huì)像Task<Task<...>>從延續(xù)函數(shù)中返回另一個(gè)承諾那樣結(jié)束結(jié)構(gòu).因此,我對(duì)不得不使用這種ContinuesWith語(yǔ)法而不是更具可讀性的 async-await 模式不太滿意,如果后者只是有效的話。我在 C# HTTP 調(diào)用的 async-await 變體中做錯(cuò)了什么?
查看完整描述

1 回答

?
神不在的星期二

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊

因此,根據(jù)對(duì)ConfigureAwait(false)您的問題有幫助的事實(shí)判斷,請(qǐng)從 Stephen Cleary 的博客中閱讀這些內(nèi)容:http : //blog.stephencleary.com/2012/07/dont-block-on-async-code.html

這家伙幾乎是async專家(他在 C# Cookbook 書中寫了并發(fā)),所以無(wú)論我能說(shuō)什么,他都可能解釋得更好?;旧夏銚踝×薃SP.NET線程的地方,也許不是用await所有的方式,而是Wait,Result還是GetResult()。您應(yīng)該能夠使用該博客自行診斷問題。

什么ConfigureAwait(false)做的是它并沒有抓住當(dāng)前背景下,這樣的HTTP請(qǐng)求被執(zhí)行(正確的)其他地方比在ASP.NET背景下,防止死鎖。

編輯:

GetAwaiter().GetResult()從您的評(píng)論來(lái)看,是什么導(dǎo)致了問題。如果您將其更改為await和調(diào)用方法,async您可能會(huì)解決所有問題。

由于 C# 7.0 和async Task Main()方法支持,因此真的沒有理由await在應(yīng)用程序代碼中阻塞而不是使用。


查看完整回答
反對(duì) 回復(fù) 2021-11-21
  • 1 回答
  • 0 關(guān)注
  • 216 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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