Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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_Performance - Fatal编程技术网

C# 在应用程序开始时加载所有项目,还是在每个用户操作上加载所需项目?

C# 在应用程序开始时加载所有项目,还是在每个用户操作上加载所需项目?,c#,wpf,performance,C#,Wpf,Performance,我正在做一个小应用程序,它可以查询web服务中特定游戏中物品的游戏内价格。这个游戏显然有超过200个项目在游戏中(与他们相关的uintid),并有不同的项目类型(矿石,战斗等)。在我的应用程序中,我有一个视图,允许用户指定他想要查询的价格,它有两个组合框:一个用于项目类型,第二个用于显示该特定类型的项目(因此,当第一个组合框更改时,第二个组合框显示与所选项目类型关联的项目) 此外,我没有直接访问游戏数据库的所有项目类型,项目及其相关ID。我必须在自己的数据库、XML文件或其他类似容器中复制这些信

我正在做一个小应用程序,它可以查询web服务中特定游戏中物品的游戏内价格。这个游戏显然有超过200个项目在游戏中(与他们相关的
uint
id),并有不同的项目类型(矿石,战斗等)。在我的应用程序中,我有一个视图,允许用户指定他想要查询的价格,它有两个组合框:一个用于项目类型,第二个用于显示该特定类型的项目(因此,当第一个组合框更改时,第二个组合框显示与所选项目类型关联的项目)

此外,我没有直接访问游戏数据库的所有项目类型,项目及其相关ID。我必须在自己的数据库、XML文件或其他类似容器中复制这些信息(可以在线获得)


知道了这一点,我的问题是什么是最好的:在应用程序打开时将整个数据库(或解析整个XML文件)加载到
列表中
,或者在用户每次更改项目类型组合框时查询数据库(或解析XML文件的一部分)?如果我在应用程序开始时进行整个加载,可能会遇到应用程序,但在另一方面,如果每次用户更改项目类型组合框时查询数据库(或解析XML文件),可能会出现“延迟”的问题每次在应用程序中,他都会执行该操作。

您要做的第一件事是建立一个高级界面,该界面不会涉及或提及这些细节,以便您可以在以后必要时改变主意,并尽可能少地做出响应。让界面关注它应该做什么,而不是它应该如何做。把那些“如何”藏起来,保密

优化最好在事后诸葛亮的情况下应用,使用分析器和测量工具,代码可以在不太侵入/侵入的情况下进行优化,并且不会在整个代码库中造成级联中断(通过隐藏在良好的界面下)

其次,请记住,一百万个32位浮点变量只需要4兆字节的RAM。我来自一个4兆字节被认为是巨大内存的时代。今天我们谈论的是便士。通常,200个项目的数据远远不够,不足以让您担心实施磁盘索引结构所带来的额外费用和困难,除非每个项目都存储了一百万个子元素

因此,除非您处理的是异常庞大的项目,否则我建议您从启动时将其加载到内存的基本解决方案开始


如果涉及到存储逻辑,那么您的案例和规模更大的问题可能是安全性和原子性,而不是性能,以确保项目事务100%成功完成,或者作为一个整体失败/回滚100%(从未完成一半)。您可能还希望定期写入磁盘,以确保在服务器意外关闭的情况下不会丢失数据,但除了安全备份之外,您不必使用该文件结构。虽然我不清楚你是在处理商店端的逻辑,还是仅仅为客户提供了一个方便的客户。如果是后者,你可以忘记这些东西。

你要做的第一件事是建立一个高级界面,不去理会或提及这些细节,这样你可以在必要时改变主意,并尽可能少地做出回应。让界面关注它应该做什么,而不是它应该如何做。把那些“如何”藏起来,保密

优化最好在事后诸葛亮的情况下应用,使用分析器和测量工具,代码可以在不太侵入/侵入的情况下进行优化,并且不会在整个代码库中造成级联中断(通过隐藏在良好的界面下)

其次,请记住,一百万个32位浮点变量只需要4兆字节的RAM。我来自一个4兆字节被认为是巨大内存的时代。今天我们谈论的是便士。通常,200个项目的数据远远不够,不足以让您担心实施磁盘索引结构所带来的额外费用和困难,除非每个项目都存储了一百万个子元素

因此,除非您处理的是异常庞大的项目,否则我建议您从启动时将其加载到内存的基本解决方案开始


如果涉及到存储逻辑,那么您的案例和规模更大的问题可能是安全性和原子性,而不是性能,以确保项目事务100%成功完成,或者作为一个整体失败/回滚100%(从未完成一半)。您可能还希望定期写入磁盘,以确保在服务器意外关闭的情况下不会丢失数据,但除了安全备份之外,您不必使用该文件结构。虽然我不清楚你是在处理商店端的逻辑,还是仅仅为客户提供了一个方便的客户。如果是后者,你可以忘记这些东西。

我会在启动应用程序后启动一个异步方法,在那里加载游戏项目。这样,当用户在应用程序中执行任何操作时,它也不会阻塞UI。我在我的应用程序中做到了这一点,用户正在阅读电子书,它同时加载200本书。通过这种方式,用户可以在后台加载书籍的同时继续阅读等等。

我会在启动应用程序后启动一个异步方法,加载游戏项目。这样,当用户在应用程序中执行任何操作时,它也不会阻塞UI。我已经在我的应用程序中这样做了,用户正在阅读电子书并加载它