C#/ Xamarin列表自行清空

时间:2018-01-26 12:03:02

标签: c# list xamarin.android

我在C#/ Xamarin的跨平台PCL解决方案的Android部分工作 - 我对Xamarin和移动开发人员来说都是新手。

在循环中,我尝试查询REST服务以获取某些地理信息(工作正常),将结果反序列化为对象(也可以正常工作),然后将所述对象添加到列表中(工作正常< EM>一旦)。我遇到的问题是,每次获取反序列化对象的方法返回时,它们的集合都被神奇地清空(Count为0)。

这就是列表所在的位置:

List<Thingy> thingyList = new List<Thingy>();

//Setting some variables
//.
//.

using (HttpClient client = new HttpClient())
{
    //Positive offset loop
    for (double latUnderTest = Lat; latUnderTest <= latOffsetCoordsMax; latUnderTest += latOffset3M)
    {
        //Bound to our max coords
        latUnderTest = latUnderTest > latOffsetCoordsMax ? latOffsetCoordsMax : latUnderTest;

        for (double longUnderTest = Long; longUnderTest <= longOffsetCoordsMax; longUnderTest += longOffset3M)
        {
            //Bound to our max coords
            longUnderTest = longUnderTest > longOffsetCoordsMax ? longOffsetCoordsMax : longUnderTest;

            //Don't query areas we've already done
            if (HasLocationBeenQueried(latUnderTest, longUnderTest))
            {
                continue;
            }

            Thingy thingy = await GetThingyForCoords(latUnderTest, longUnderTest, client);

            if (thingy != null)
            {
                thingyList.Add(thingy);
                AdjustQueriedArea(latUnderTest, longUnderTest);
            }
        }
    }

    //Negative offset loop, not reached for the purpose of this
    //.
    //.

    return thingyList;
}

是的,循环有点恶心,但这只是一个快速而肮脏的第一次运行。无论如何,这是提出请求的方法:

public async Task<Thingy> GetThingyForCoords(double Lat, double Long, HttpClient Client)
{
    try
    {
        using (HttpResponseMessage resp = await Client.GetAsync(aUrlIKnowWorks))
        {
            return resp.IsSuccessStatusCode ? JsonConvert.DeserializeObject<Thingy>(await resp.Content.ReadAsStringAsync()) : null;
        }
    }
    catch (Exception e)
    {
        return null;
    }
}

我没有在每次循环迭代中添加相同的对象或任何愚蠢的东西,并且请求不是每次都返回空值所以我不知所措 - 我的猜测是这有些奇怪与在移动设备上使用异步相关的线程相关问题,或HttpClient与Xamarin之间的一些未记录的不兼容问题,但我真的不知道从哪里开始调试。

1 个答案:

答案 0 :(得分:2)

因为您只调用list.Add(),所以列表无法清空。因此,您必须查看其他列表。

必须多次调用该函数,每次都创建一个新列表。在调试时,并不总是很明显你在不同的线程上的不同列表。

作为事后的想法:将来可能会帮助您发现此类问题的一点是打开“在源代码中显示线程”。

Show threads in source

然后,在调试时,您会在左侧看到这些图标,暗示当前正在等待该行代码的第二个线程。
虽然,我个人觉得它们有点不清楚。

Thread icon