Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以做些什么来减少程序的加载时间?_C#_Wpf - Fatal编程技术网

C# 我可以做些什么来减少程序的加载时间?

C# 我可以做些什么来减少程序的加载时间?,c#,wpf,C#,Wpf,我正在开发一个程序,它可以包含你添加到程序中的所有程序和游戏,这样你就可以在一个地方拥有它们。该程序还具有搜索功能 问题是,程序在第一次运行时或重新启动计算机后需要一段时间才能加载。我很确定这是因为我使用Icon.ExtractAssociatedIcon从可执行文件中获取图标 因此,如果XML文件中有很多内容(我将数据保存在XML文件中),那么加载程序需要一段时间,因为我提取了可执行文件图标 我制定了一个方法,让我更轻松: public static BitmapImage GetExeIco

我正在开发一个程序,它可以包含你添加到程序中的所有程序和游戏,这样你就可以在一个地方拥有它们。该程序还具有搜索功能

问题是,程序在第一次运行时或重新启动计算机后需要一段时间才能加载。我很确定这是因为我使用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.getexecicon(exePath),因此它对它添加的所有项都这样做

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

顺便说一句,如果内容太多,很抱歉,我总是想说得具体一些,但是文字太多了。如果你需要更多的信息,请告诉我

你不必阅读下面的内容,但读过的人可能会有一些建议:

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


有时我会休息很长时间,因为我不知道我应该做什么,而失去动力是因为我觉得几个月后我什么也没学到(有时我仍然会失去动力,因为我觉得自己不够好或没有学习)

回答这个问题:如果这是问题的话,你可能会研究缓存图标。另外,在你的屏幕截图中,你只显示了8个图标,所以你可以在后台加载其余的图标。如果你想变得更时尚,你可以像VisualStudio的nuget包管理器一样异步加载所有东西

其他注释:xml加载代码似乎有点僵硬——您不应该依赖于属性的顺序。我认为这是一个好的开始

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

    我建议将事情异步化,并在后台加载它们,然后在事情发生时更新UI。如果你不熟悉的话,在猜测与时间相关的内容之前,先考虑一下大的重构和改进,这将只在10%的负载时间改进中起作用,你应该考虑使用DoTrror之类的剖析器。我打赌图标的加载不是真正的问题。我同意@HimBromBeere;当我试着猜什么东西慢以及它有多慢时,我可能有超过三分之一的时间是错的。使用探查器进行更改,然后再次进行探查以查看其是否有效。设定绩效目标,并使用良好的工程纪律来实现该目标;不要尝试随机的东西,直到它工作。顺便说一句:你的“程序”标签名称与“类型”标签不一致。如果一个讨厌的用户输入:
    […]应用程序[…]
    ?刚到家检查,看起来像是icon.extractassociatedicon,因为它经常被调用。关于类型,我在做的时候也这么想,我想我这么做是因为我认为这样做会更容易谢谢:-)我明天醒来时会试试,现在有点累:-)我只是尝试了xml序列化/反序列化,但我似乎无法让它更改applicationList的根名称(它是ObservableCollection类型),这让我发疯。我可能用错了属性。根名称只是,但我不想更改它。我试图将XmlArray(“应用程序”)放在applicationList之上,但没有成功。我看到过一些例子,但我不适合自己。但是我明天会尝试其他的,然后也许我可以让xml序列化工作重新保存和加载,所以现在它使用xml序列化/反序列化:-),看起来它现在启动得更快了,而且不会冻结窗口。我还添加了一个默认图标,因此它会显示该图标,当所有图标都加载时,它会设置真实的图标。很好用:-)你还想试试吗?当然。在这里发布一个链接,我可以得到它。是的,我知道我不应该依赖于顺序,但我想不出太多,我忘记了序列化:-)但我只是用XML序列化/反序列化重新编写了保存/加载,它使代码更短,更容易理解。现在我只需要在后台加载图标:-),这样我完成后就会回来