我从数据库中加载数据,当我按下按钮接收不同的数据时,我在日志中看到“爬山,更改最大线程数5”,当我尝试收集数据时,这会使应用程序变慢。
任何想法如何解决这个问题?还是这甚至会使应用程序变慢?肯定看起来有些怪异,因为与ios相比,当我在android设备上加载数据时花了几秒钟的时间。
这是我的代码:
static public async Task<JObject> getContacts ()
{
var httpClientRequest = new HttpClient ();
try {
var result = await httpClientRequest.GetAsync ("http://address.com");
var resultString = await result.Content.ReadAsStringAsync ();
var jsonResult = JObject.Parse (resultString);
return jsonResult;
} catch {
return null;
}
}
以及我如何使用它:
async void createData (object s, EventArgs a)
{
var getContacts = await parseAPI.getContacts ();
if (getContacts != null) {
listview.ItemsSource = null;
theList = new List <items> ();
foreach (var items in getContacts["results"]) {
theList.Add (new items () {
Name = items ["Name"].ToString (),
Number = items ["Number"].ToString ()
});
}
}
listview.ItemsSource = theList;
}
最佳答案
在Mono运行时中,“爬坡”是相当普遍的,因为自适应线程池的数量根据当前的依赖关系而增加(或减少)。
我个人怀疑线程数5是否会导致您的应用程序出现任何问题。看到30、50、100+可能/将是一个问题,因为上下文切换的混乱可能/将使应用程序(和操作系统)崩溃。
就操作系统的“速度”而言,iOS
模拟器与Android模拟器相比非常庞大。在实际设备上进行仪器和性能测试。
Mono启发式线程池参考:
https://github.com/mono/mono/blob/master/mono/metadata/threadpool-ms.c
hill_climbing_change_thread_count (gint16 new_thread_count, ThreadPoolHeuristicStateTransition transition)
{
ThreadPoolHillClimbing *hc;
g_assert (threadpool);
hc = &threadpool->heuristic_hill_climbing;
mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_THREADPOOL, "[%p] hill climbing, change max number of threads %d", mono_native_thread_id_get (), new_thread_count);
hc->last_thread_count = new_thread_count;
hc->current_sample_interval = rand_next (&hc->random_interval_generator, hc->sample_interval_low, hc->sample_interval_high);
hc->elapsed_since_last_change = 0;
hc->completions_since_last_change = 0;
}