亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

非靜態類中靜態方法的生命周期是多少

非靜態類中靜態方法的生命周期是多少

C#
瀟瀟雨雨 2021-11-21 15:50:07
我正在嘗試從在 IIS 8.5 上運行的 ASP.NET 應用程序中對另一臺服務器進行 HTTP 調用。首先,我從 Microsoft 的一篇文章Call a Web API From a .NET Client (C#) 中得到了一些提示。我可以很容易地看到他們如何在那里進行 HTTP 調用的模式;僅顯示一個縮短的示例:    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    }很簡單,我想,所以我很快為我的應用程序編寫了一個類似的方法(請注意,ReadAsAsync擴展方法似乎需要一個額外的庫,所以我選擇了一個內置的、更抽象的,但在其他方面可能是類似的方法):    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);    }不幸的是,調用此方法會導致我的應用程序掛起。調試時,事實證明await調用GetAsync永遠不會返回。摸索了一會兒后,我碰上了一個遙控類似的問題,在其評論部分,我發現一個很有意思的建議,通過B君:刪除所有異步內容并確保它有效。所以我試了一下:    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));    }有點令人驚訝(對我來說),這是有效的。 GetAsync在不到一秒的時間內返回來自其他服務器的預期響應。現在,同時使用 AngularJS,我對response.Result.Content和 之類的東西感到有點失望str.Result.Result。在 AngularJS 中,我希望上面的調用只是類似于:$http.get(url).then(function (response) {    return response.data;});即使我們不考慮 JavaScript 中發生的自動 JSON 反序列化,AngularJS 代碼仍然更容易,因為 egresponse沒有被包裝成一個承諾或類似的東西,我也不會像Task<Task<...>>從延續函數中返回另一個承諾那樣結束結構.因此,我對不得不使用這種ContinuesWith語法而不是更具可讀性的 async-await 模式不太滿意,如果后者只是有效的話。我在 C# HTTP 調用的 async-await 變體中做錯了什么?
查看完整描述

2 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

方法沒有生命周期。他們在那里??偸?。

(關于延遲加載程序集和即時編譯可能有更復雜的解釋,但對于垃圾收集器,它們無關緊要。方法存在。它們沒有生命周期。它們永遠不會被刪除。)

實例都有相同的生命周期:直到對它們的最后一次引用超出范圍并且垃圾收集器來刪除它們。

誰創建了實例并不重要。誰持有對它的引用才重要。您的方法不保留對創建的實例的引用,因此調用者將決定生命周期(通過成為唯一引用它的方法,直到調用者授予其他人的訪問權限)。


查看完整回答
反對 回復 2021-11-21
?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

以這種方式創建的對象的生命周期與通過非靜態方法創建的對象的生命周期完全相同。就那么簡單。


查看完整回答
反對 回復 2021-11-21
  • 2 回答
  • 0 關注
  • 185 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號