如何减少程序的加载时间?

时间:2015-09-18 14:12:11

标签: c# wpf

我正在开发一个程序,它可以包含您添加到程序中的所有程序和游戏,因此您可以将它们集中在一个位置。该程序还具有搜索功能。

问题是程序在第一次运行时或重新启动计算机后需要一段时间才能加载。我很确定这是因为我使用Icon.ExtractAssociatedIcon从可执行文件中获取图标。

因此,如果XML文件中有很多(我将数据保存在XML文件中),那么加载程序需要一段时间,因为我提取了可执行文件图标。

我制定了一种方法让我更容易:

public static BitmapImage GetExeIcon(string path)
{
    try
    {
        using (MemoryStream memory = new MemoryStream())
        {
                    System.Drawing.Icon.ExtractAssociatedIcon(path).ToBitmap().Save(memory, System.Drawing.Imaging.ImageFormat.Png);
                    memory.Position = 0;
                    BitmapImage bitmapImg = new BitmapImage();
                    bitmapImg.BeginInit();
                    bitmapImg.StreamSource = memory;
                    bitmapImg.CacheOption = BitmapCacheOption.OnLoad;
                    bitmapImg.EndInit();

                    return bitmapImg;
        }
    }
    catch (Exception)
    {
        MessageBox.Show("Are you sure it is a valid exe path?");
    }

    return null;
}

我会承认,我不明白的使用块中有一些东西, 但我尽可能多地了解它。

加载方法:

public void Load()
{
    if(File.Exists("ApplicationSaves\\apps.xml"))
    {
        using (XmlReader xmlReader = XmlReader.Create("ApplicationSaves\\apps.xml"))
        {
            string name = string.Empty;
            string desc = string.Empty;
            ApplicationItem.AppType type = ApplicationItem.AppType.Game;
            string exePath = string.Empty;

            while (xmlReader.Read())
            {
                switch (xmlReader.Name)
                {
                    case "Name":
                        name = xmlReader.ReadElementContentAsString();
                        break;
                    case "Description":
                        desc = xmlReader.ReadElementContentAsString();
                        break;
                    case "Type":
                        type = (xmlReader.ReadElementContentAsString() == "Game" ? ApplicationItem.AppType.Game : ApplicationItem.AppType.Program);
                        break;
                    case "ExePath": //This is the last data it needs
                        exePath = xmlReader.ReadElementContentAsString();
                        GlobalManager.applicationList.Add(new ApplicationItem() { Name = name, Description = desc, ExePath = exePath, Type = type, Icon = GlobalManager.GetExeIcon(exePath) });
                        break;
                }
            }
        }
    }
}

你可以看到我在最后的情况下使用“ExePath”的情况下使用GlobalManager.GetExeIcon(exePath),所以它会对它添加的所有项目执行

上一张图片你可以看到我使用的图标:-) 您有什么建议我可以减少加载时间吗?我知道我可以将提取的图标保存到文件夹中,如果它们存在则从那里加载它们,我想这会减少加载量。但如果你知道更好的方式,我会很感激: - )

Some of the saved data in the xml

Main window of the app, you can see what i use the icons for

PS。对不起,如果阅读太多,我总是试图具体,但有很多文字。如果您需要更多信息,请告诉我。

您不必阅读以下内容,但也许有人阅读它有一些建议:

我不会说我是C#(我大约两年前开始)或一般编程的新手。使用C#2年,我仍然不知道如何/何时/为什么使用结构,接口和其他很酷的东西。

我有时因为我不知道自己该做什么而失去动力,因为我觉得自己几个月后什么也没学到(因为我觉得自己不好足够或不学习)

2 个答案:

答案 0 :(得分:1)

回答这个问题:如果这是问题,你可能会考虑缓存图标。此外,在您的屏幕截图中,您只显示了8个图标,因此您可以在后台加载其余图标。如果你想变得更加漂亮,你可以加载异步,就像Visual Studio的nuget包管理器一样。

其他评论:xml加载代码看起来有点笨拙 - 你不应该依赖于属性的顺序。我认为Is it possible to deserialize XML into List<T>?是一个好的开始。

答案 1 :(得分:1)

  1. 重做您的XML方法。您可以非常轻松地使用序列化和反序列化来处理加载和保存xml。
  2. 您应该在后台线程中加载图标。您的应用程序的其余部分不需要图标才能工作,因此您应该定义一个默认图标,并在加载后使用正确的图标更新UI。
  3. 您应该缓存之前加载的图标。这样可以避免在第一次运行后显示默认图标。在后台线程中,您仍然可以扫描可执行文件并更新缓存以确保您拥有最新的图标。
  4. 另一方面,它看起来像一个很酷的小应用程序。我不介意成为你的测试员。完成后更新此答案。