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