C# 读取多个XML文件会冻结应用程序
我正试图为一款名为Eve Online的游戏编写一个应用程序,人们在该游戏中挖掘行星以获取产品。这个应用程序基本上是为我而设计的,它应该告诉人们他们的操作何时到期,这样他们就可以重新设置了。有些玩家有30个角色,有120个行星和200多个定时操作 我已经编写了将字符存储在SQLite数据库中的代码,然后我将每个字符提取2个验证码并返回它们的设备。此信息存储在两个单独的XML文档中。一个是行星,另一个是每个行星上的设备。我试图通过以下方式解决所有问题:C# 读取多个XML文件会冻结应用程序,c#,C#,我正试图为一款名为Eve Online的游戏编写一个应用程序,人们在该游戏中挖掘行星以获取产品。这个应用程序基本上是为我而设计的,它应该告诉人们他们的操作何时到期,这样他们就可以重新设置了。有些玩家有30个角色,有120个行星和200多个定时操作 我已经编写了将字符存储在SQLite数据库中的代码,然后我将每个字符提取2个验证码并返回它们的设备。此信息存储在两个单独的XML文档中。一个是行星,另一个是每个行星上的设备。我试图通过以下方式解决所有问题: using System; using Sy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace PITimer
{
class GetPlanets
{
private long KeyID, CharacterID;
private string VCode;
string CharName;
public List<long> planets = new List<long>();
public List<string> planetNames = new List<string>();
public List<AllInfo> allInfo = new List<AllInfo>();
public GetPlanets(long KeyID, long CharacterID, string VCode, string CharName)
{
this.KeyID = KeyID;
this.CharacterID = CharacterID;
this.VCode = VCode;
this.CharName = CharName;
}
public async Task PullPlanets()
{
XmlReader lesern = XmlReader.Create("https://api.eveonline.com/char/PlanetaryColonies.xml.aspx?keyID=" + KeyID + "&vCode=" + VCode + "&characterID=" + CharacterID);
while (lesern.Read())
{
long planet = 000000;
string planetName;
planet = Convert.ToInt64(lesern.GetAttribute("planetID"));
planetName = lesern.GetAttribute("planetName");
if ((planet != 000000) && (planetName != null))
{
planets.Add(planet);
planetNames.Add(planetName);
await GetExpirationTimes(planet, planetName);
}
}
}
public async Task GetExpirationTimes(long planetID, string planetName)
{
string planet = planetID.ToString();
XmlReader lesern = XmlReader.Create("https://api.eveonline.com/char/PlanetaryPins.xml.aspx?keyID=" + KeyID + "&vCode=" + VCode + "&characterID=" + CharacterID + "&planetID=" + planet);
while (lesern.Read())
{
string expTime;
expTime = lesern.GetAttribute("expiryTime");
if ((expTime != null) && (expTime != "0001-01-01 00:00:00"))
{
allInfo.Add(new AllInfo(CharName, planetName, Convert.ToDateTime(expTime)));
}
}
}
public List<long> ReturnPlanets()
{
PullPlanets();
return planets;
}
public List<string> ReturnNames()
{
return planetNames;
}
public List<AllInfo> ReturnAllInfo()
{
return allInfo;
}
}
}
这是可行的,它返回数据,我在XamarinAndroid上运行到一个ListView中。我的问题是它在运行时会冻结系统。我用2个字符进行测试,UI有时会冻结几秒钟。其他时候运行良好。但是有了30个字符,我就要遇到麻烦了
在我能想象到的每种配置中,我都尝试过使用async和task来解决这个问题。它仍然很慢或者根本不工作。我如何将其设置为在应用程序中工作的方式
它还在后台服务中运行一个更轻的检查,确实如此,但我担心我会给系统带来压力
可以在这里看到planet XML:
我提取行星ID并从中运行以下XML:
我以前使用过XMLDoc,但我认为reader会更好更快 不要在UI线程上执行I/O。问题解决了!这听起来似乎是真的。不过,你能详细说明一下吗?我不是很好,我相信你可以从我的代码和我的问题中看到。生成一个线程来完成所有这些阅读,然后返回到UI线程。工作线程完成后,可以使用Invoke将数据通知UI线程。这对我来说还有两点:使用多个连接并行下载3个连接意味着你获得数据的速度快了3倍,000000不是你想象的那样。太棒了!谢谢。因此,从我的片段中,我可以做一些像GetPlanet=new GetPlanetsKeyIDOut、CharIDOut、VCodeOut、navnOut;ThreadPool.QueueUserWorkItem o=>GetPlanet.PullPlanets;newInfo=GetPlanet.ReturnAllInfo;allInfo.AddRangenewInfo;我已经试过一百万次了,现在我都糊涂了。很抱歉。我不知道如何打开更多的连接,但非常感谢您的建议,并将查看它。请写一个答案,这样我就可以将它标记为已回答。生成另一个线程将使您的UI保持响应,但另一个注意事项是,简单地将方法标记为async并不能使其异步运行。如果您对开始使用异步代码感兴趣,可以看看。