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