我从数据库中加载数据,当我按下按钮接收不同的数据时,我在日志中看到“爬山,更改最大线程数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;
}

09-30 23:02
查看更多