C#/Xamarin列表正在清空自身
我在C#/Xamarin从事跨平台PCL解决方案的Android部分的工作——我对Xamarin和移动开发一般来说都是新手 在一个循环中,我试图查询REST服务中的一些地理信息(工作正常),将结果反序列化到一个对象中(工作正常),然后将所述对象添加到列表中(工作正常一次)。我遇到的问题是,每次获取反序列化对象的方法返回时,它们的集合都会被神奇地清空(计数为0) 这就是清单的所在:C#/Xamarin列表正在清空自身,c#,list,xamarin.android,C#,List,Xamarin.android,我在C#/Xamarin从事跨平台PCL解决方案的Android部分的工作——我对Xamarin和移动开发一般来说都是新手 在一个循环中,我试图查询REST服务中的一些地理信息(工作正常),将结果反序列化到一个对象中(工作正常),然后将所述对象添加到列表中(工作正常一次)。我遇到的问题是,每次获取反序列化对象的方法返回时,它们的集合都会被神奇地清空(计数为0) 这就是清单的所在: List<Thingy> thingyList = new List<Thingy>();
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;
}
List thingyList=new List();
//设置一些变量
//.
//.
使用(HttpClient=new HttpClient())
{
//正偏置回路
对于(双latUnderTest=Lat;latUnderTest latOffsetCoordsMax?latOffsetCoordsMax:latUnderTest;
对于(双longUnderTest=Long;longUnderTest longOffsetCoordsMax?longOffsetCoordsMax:longUnderTest;
//不要查询我们已经完成的区域
if(已查询位置(latUnderTest、longUnderTest))
{
继续;
}
Thingy Thingy=等待获得合作(latUnderTest、longUnderTest、client);
if(thingy!=null)
{
thingyList.Add(thingy);
调整Queriedarea(车床欠测、长欠测);
}
}
}
//负偏移循环,未达到此目的
//.
//.
返回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;
}
}
public异步任务GetThingyForCoords(双Lat,双Long,HttpClient)
{
尝试
{
使用(httpresponsemessageresp=wait Client.GetAsync(aUrlIKnowWorks))
{
return resp.issucessStatusCode?JsonConvert.DeserializeObject(wait resp.Content.ReadAsStringAsync()):null;
}
}
捕获(例外e)
{
返回null;
}
}
我不是每次循环迭代都添加同一个对象,也不是每次请求都返回空值,所以我很茫然——我猜这是由于在移动设备上使用异步导致的一些奇怪的线程相关问题,或者HttpClient和Xamarin之间的一些未记录的不兼容,但我真的不知道该怎么办rom在此进行调试。因为您只调用过
list.Add()
列表本身无法清空。因此您必须查看不同的列表
必须多次调用该函数,每次都创建一个新列表。调试时,并不总是很明显您位于不同线程的不同列表中
事后想一想:将来可能有助于检测此类问题的方法是启用“在源代码中显示线程” 然后,在调试时,您将在左侧看到这些图标,这表明当前有第二个线程正在该代码行等待。
虽然,我个人觉得他们有点不清楚
您只引用thingyList一次,
thingyList.Add(thingy)
不会清空它。因此:1.您从未实际调用Add
,这是您通过调试/日志记录检查的。或者2.您在第二个未显示的位置引用thingyList。可能会在问题中发布此内容?或者3.您多次调用整个函数,因此当您查看调试器并查看一个空列表您实际上看到的是一个不同的新列表()
,这可以解释为什么它是空的。您可以通过一些日志再次检查,看看调用新列表()
的频率。@BuhBuh感谢您的响应-回答您的问题:1)Add
肯定被调用了,我随后验证了调试器中的计数是否增加了。2)唯一的其他引用是在返回时,我现在已经添加了它。3) 此方法只应调用一次,但即使调试器不应将其保留在适当的位置,调试器也不应将其保留在适当的位置??我不知道你这是什么意思。不我认为您应该在new List()
上添加一个断点,以实际测试调用它的次数,而不是假设。如果你所有的答案都是正确的,那么它就不可能是空的。arghh,明白了-该方法意外地绑定到位置更新,我猜是因为该方法是异步的,而调试器已停止让我查看计数,该方法正在被重新调用,因此我每次都在查看不同的Count
实例。。。将发布具有相同效果的答案。我讨厌只存在的问题,因为我正在调试以寻找问题/啊,对不起。。。等等,我会删除我的并给你,你的第三点让我意识到我的错误。