早上好,
这是一个更多关于WTF是什么类型的问题。我的应用程序正在使用ViewState。我在应用程序中放置了一个UpdatePanel,仅用于测试目的。它每秒钟都会访问我的日志表,并为我生成实时日志控制台,以便我查看应用程序如何处理事情。
今天早上,我决定将我的使用ViewState改为Session。现在,我的UpdatePanel不再同步运行,并且“暂停”直到操作完成以更新UpdatePanel/Console。
切换回ViewState可以使事情正常运行...
此外,我的UpdatePanel调用的函数与ViewState或SessionState没有关系,并且没有调用任何一个...
我已经能够在小型测试样本中复现此行为:
TestUpdatePanelWithSession.Master
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="TestUpdatePanelWithSession.master.cs" Inherits="Tester2._0.TestUpdatePanelWithSession1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:Timer ID="Timer1" runat="server" Enabled="True" Interval="1000"></asp:Timer>
<div>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
<asp:UpdatePanel ID="UpdatePanel1"
UpdateMode="Always"
runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
</Triggers>
<ContentTemplate>
<%= System.DateTime.Now.ToString("mm:ss") %>
</div>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
TestUpdatePanelWithSession.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/TestUpdatePanelWithSession.Master" AutoEventWireup="true" CodeBehind="TestUpdatePanelWithSession.aspx.cs" Inherits="Tester2._0.TestUpdatePanelWithSession" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<asp:Label ID="lblTest" runat="server" Text="Label"></asp:Label>
<asp:Button ID="btnStartTest" runat="server" Text="Test" OnClick="btnStartTest_Click" />
</asp:Content>
TestUpdatePanelWithSession.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Tester2._0
{
public partial class TestUpdatePanelWithSession : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Session["SomeIndex"] = 50000;
}
}
protected void btnStartTest_Click(object sender, EventArgs e)
{
for (int i = 0; i < 1000000; i++)
{
System.Threading.Thread.Sleep(500);
Session["SomeOtherIndex"] = i;
lblTest.Text = ((int)Session["SomeIndex"] + (int)Session["SomeOtherIndex"]).ToString();
}
}
}
}
如果您将所有的Session更改为ViewState,则上述代码可以正常工作。这是怎么回事?
提前感谢您的课程...