Xamarin.Android HTTP随机延迟

时间:2017-01-21 20:37:11

标签: c# xamarin xamarin.android threadpool dotnet-httpclient

我有一个方法可以执行多个名为LoadServers()的HTTP请求执行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);
    }
}

LoadServers()每执行大约15次会产生以下日志声明:

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请求的资源消耗有关?它会尝试清理资源并暂停执行,直到发生这种情况?我不确定执行请求时到底发生了什么。它会启动一个新线程吗?

2 个答案:

答案 0 :(得分:2)

找出确切的问题很难,我无法重现它。但是,System.Net中的HttpClient和默认MessageHandler的包装未完全优化。所以,你猜测它是一个资源问题可能就是这种情况。

尝试使用ModernHttpClient(Xamarin Component | Nuget | Developer Review | Github),并在构造函数中为NativeMessageHandler添加HttpClient 。这将使用一些优化的本机库(对于Android,它是OkHttp),这将有助于提高性能。

答案 1 :(得分:0)

我试验了同样的问题。 我正在使用xamarin.android 6.6.1.2-21并支持Api 23的内容。

我发现在第一次调用之前使用默认的httpHandler 并创建2个httpClients来解决此问题。

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

并在开始代码中的任何真实调用之前创建2个httpclients。

同时设置&#34; HttpClient实现&#34; to&#34; AndroidClientHandler&#34;。您可以在以下项目中找到此选项:项目选项&gt; Android构建&gt;代码生成和运行时。 这只适用于android 5 +

http implementation option