C# 读取多个XML文件会冻结应用程序

C# 读取多个XML文件会冻结应用程序,c#,C#,我正试图为一款名为Eve Online的游戏编写一个应用程序,人们在该游戏中挖掘行星以获取产品。这个应用程序基本上是为我而设计的,它应该告诉人们他们的操作何时到期,这样他们就可以重新设置了。有些玩家有30个角色,有120个行星和200多个定时操作 我已经编写了将字符存储在SQLite数据库中的代码,然后我将每个字符提取2个验证码并返回它们的设备。此信息存储在两个单独的XML文档中。一个是行星,另一个是每个行星上的设备。我试图通过以下方式解决所有问题: using System; using Sy

我正试图为一款名为Eve Online的游戏编写一个应用程序,人们在该游戏中挖掘行星以获取产品。这个应用程序基本上是为我而设计的,它应该告诉人们他们的操作何时到期,这样他们就可以重新设置了。有些玩家有30个角色,有120个行星和200多个定时操作

我已经编写了将字符存储在SQLite数据库中的代码,然后我将每个字符提取2个验证码并返回它们的设备。此信息存储在两个单独的XML文档中。一个是行星,另一个是每个行星上的设备。我试图通过以下方式解决所有问题:

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并不能使其异步运行。如果您对开始使用异步代码感兴趣,可以看看。