簡體   English   中英

Xamarin.Android HTTP隨機延遲

[英]Xamarin.Android HTTP Random Delays

我有執行名為幾個HTTP請求的方法LoadServers() A按鈕執行LoadServers() 對於我的問題,僅在上一次LoadServers()調用完成后才點擊按鈕。 加載時出現進度對話框,因此我只能串行執行它們。

大約每10-15次調用LoadServers導致第一個http請求延遲幾乎10秒。 LoadServers完成的平均時間少於半秒,並且永遠不會超過1秒。 這僅在Xamarin.Android上發生。 Xamarin.iOS不會發生延遲,並且所有這些代碼都是共享的。

這是我的代碼

private async Task LoadServers() {
    await Get();
    await Post();
    await Get();
    await Get();
    await Post();
}

private async Task Get() {
    var url = _httpClient.BaseAddress + model.GetToken();
    Log("Attempting to send GET to: " + url);
    using (var response = await _httpClient.GetAsync(url))
    {
        var resultContent = await response.Content.ReadAsStringAsync();
        Log("Got response back from : " + url + ": " + resultContent);
    }
}

private async Task Post() {
    var content = requestData.GetToken() + "=" + requestData.PostBody ();
    var request = new StringContent(content)
    {
        Headers = { ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded") }
    };
    var url = _httpClient.BaseAddress + "/No_content";
    Log ("Attempting to send POST to: " + url + "  with content: " + content);
    using (var response = await _httpClient.PostAsync(url, request))
    {
        string resultContent = await response.Content.ReadAsStringAsync();
        Log("Got response back from : " + url + ": " + resultContent);
    }
}

每執行15次左右的LoadServers() ,就會生成以下日志語句:

Thread started:  #37
Thread finished:  #37
[2017-01-21T13:42:30.8841620-06:00] [debug] Loading Servers
[2017-01-21T13:42:30.8946770-06:00] [debug] Attempting to send GET to: XXX
Thread finished: <Thread Pool> #23
Thread started: <Thread Pool> #38
[2017-01-21T13:42:40.9550360-06:00] [debug] Got response back from : XXX <-- Notice the time (~10 seconds)

這與HTTP請求的資源消耗有關嗎? 它試圖清理資源並暫停執行直到發生這種情況? 我不確定執行請求時會發生什么。 它是否啟動新線程?

弄清確切的問題很困難,我無法重現。 但是,尚未完全優化HttpClientSystem.Net和默認MessageHandler的包裝。 因此,您可能會認為這是資源問題。

嘗試使用ModernHttpClient( Xamarin組件 | Nuget | 開發人員評論 | Github ),並在HttpClient的構造函數中添加NativeMessageHandler 這將使用一些優化的本機庫(對於Android,是OkHttp ),這將有助於提高性能。

我嘗試了同樣的問題。 我正在使用xamarin.android 6.6.1.2-21並支持Api 23的內容。

我發現在第一次調用之前使用默認的httpHandler並創建2個httpClient可以解決此問題。

new HttpClient( new Xamarin.Android.Net.AndroidClientHandler());

並在您的代碼中開始任何實際調用之前創建2個httpclient。

還將“ HttpClient實現”設置為“ AndroidClientHandler”。 您可以在以下位置找到此選項:項目選項> Android構建>代碼生成和運行時。 這僅適用於android 5+

http實現選項

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM