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