我已经将我的数据集存储在视图状态中(因为我需要过滤不同客户端点击的数据并显示数据)但我觉得页面加载需要很多时间,即使是复选框选中的事件(使用 AutoPostback)没有任何代码要执行几乎需要 2-3 秒。
这仅仅是因为视图状态数据,如果是这样,我可以完成我的任务吗?我需要在客户端事件上快速显示数据,所以我一直在使用视图状态。任何解决方法都会有所帮助。
正如上面提到的@Tushar,ViewState 不是您想要存储大量数据的地方。它实际上只是为了保留往返之间的控制状态,它确实会导致应用程序性能不佳。
相反,您应该查看以下服务器管理选项:
应用程序状态- 用于存储在所有用户之间共享的数据。使用服务器内存。
会话状态- 用于存储特定于用户会话的数据。还使用服务器内存。数据可以通过应用程序重新启动以及整个网络花园或服务器场进行持久化。来自 MSDN 的更多信息:http: //msdn.microsoft.com/en-us/library/z1hkazw7.aspx
这些方法的最大缺点是内存管理,因为这两个选项都会消耗服务器内存,并保留数据直到某种类型的重新启动,或者直到会话被删除。因此,这些方法并不总是可以很好地扩展。
此外,这是一篇 MSDN 文章,讨论了各种 .net 状态管理方法,每种方法都有优缺点:
第三种选择是通过使用.NET 缓存库、构建您自己的和/或使用 3rd 方缓存服务器/库来实现缓存策略。使用缓存的好处是您可以让数据在任何给定的指定时间后自动过期。但是,在网络花园或服务器场环境中工作时会引入复杂性。
要记住的最重要的事情是,上述任何策略都需要在管理/共享数据方面进行一些规划和考虑。
您可以查看页面的来源并获取ViewState
值,并使用ViewState decoder
以下url在线检查您的页面的 ViewState 字段中存储的值有多大:
http://ignatu.co.uk/ViewStateDecoder.aspx
如果您发现您的视图状态存储的值很大,那么您应该找到存储Dataset
.
无论如何,您应该避免将数据集放入您的 ViewState。
与其多次从数据源加载数据,不如只加载一次。其他答案谈论访问数据。我遇到过每次回发时都会加载数据的情况。
string myString;
public string MyString
{
get
{
// If there is already data in "myString", do not load it again!
if (this.ViewState["myData"] == null)
{
// Load data one time
this.ViewState["myData"] = "Hello";
}
return this.ViewState["myData"] as string;
}
}
ViewState 减慢页面的速度取决于您拥有多少视图状态。我继承了生成超过 1 兆字节视图状态的页面,并且看到 Web 服务器花费 10 秒来处理视图状态。如果您不想重写应用程序并且需要大量视图状态,则需要研究用于保存/恢复视图状态的替代策略。将 ViewState 保存到数据库甚至是普通文件要快得多——不必在每次请求时将视图状态流式传输到客户端或从客户端流式传输。
最好的策略是首先避免视图状态。
只是想我应该补充一下,有些控件只是 ViewState 猪,有些网格对于 viewstate 的消耗来说很糟糕。
如果您在 ViewState 中存储大量数据,您会注意到性能问题。尽管 ViewState 实际上是针对“仅此页面”而 Session 是针对“此会话”,但是您将达到 ViewState 大小的限制,其中 Session 最终会更好地提高性能。
值得注意的是,您可能遇到了其他类型的问题,而不仅仅是 ViewState 的问题(即您的数据库查询可能需要很长时间并且可能被缓存)。
由于在页面的 HTML 中嵌入了额外的数据来保存序列化的 ViewState,ViewState 使页面稍微变大。额外的大小是否会导致负载问题取决于连接速度,以及视图状态相对于页面其余部分的大小。
ViewState 与每个 HTTP 请求一起发送回服务器(因此包括您的 AutoPostback)。同样,这是否会导致明显的性能问题取决于视图状态大小和连接速度。
在具有在典型页面中可以找到的 ViewState 数据量的宽带(ish)连接上,您不会看到 2-3 秒的额外处理时间。
诊断
在浏览器中使用开发人员工具(在 IE 中,按 F12)。您可以监控 Web 请求,包括发送和接收的确切标头和正文。您还可以查看每个 HTTP 请求的时间。如果 ViewState 不是很大(可能不超过 1-2K)并且您的连接速度不是太慢,那不是您的罪魁祸首。
备择方案
您可以完全在服务器端保存状态,或者将任何大型状态项完全放在服务器上。您可以使用 Ajax 请求来处理依赖于该状态的页面事件。