其他分享
首页 > 其他分享> > 会话与ViewState的UpdatePanel的怪异行为

会话与ViewState的UpdatePanel的怪异行为

作者:互联网

早上好,

这比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,则上述代码可以正常工作.到底他妈发生了什么??

预先感谢您的课程…

解决方法:

测试完示例后,很明显问题出在会话的读写锁上.

从Page_Load中删除会话使用可避免此行为,但是这有点奇怪,因为在updatepanel调用页面时未命中代码.即使将代码移至其他函数,在另一个线程上调用它或使用任务也不会阻止此行为.

似乎ASP .net正在分析代码,当有代码使用该会话时,即使未执行该代码,它也会阻止该会话,从而阻止了回调的正常执行.只对控制事件保留会话操作似乎很好.

对于我测试过的解决方案,唯一的解决方案是删除Page_Load会话操作,这在某些情况下是不可避免的.

标签:viewstate,session,c
来源: https://codeday.me/bug/20191111/2019830.html