2016-05-31 23 views
1

Ich nicht Threads oder Sitzung beibehalten, jedoch die Variablen definiert sind während eines Postback verloren, weil ein neuer Thread erstellt wird. Gedanken?ASP.NET Postback erstellt einen neuen Thread und eine neue Sitzung

currentthreadid und sessionid ändern sich jedes Mal, wenn auf button1 oder button2 geklickt wird. Ich mache mir mehr Gedanken darüber, dass neue Threads erstellt werden. Hilfe bitte !

hier ist mein WebForm1.aspx Code

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="UpdatePanelTest2.WebForm1" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <asp:ScriptManager ID="ScriptManager1" EnablePartialRendering="true" runat="server"></asp:ScriptManager> 
     <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
      <ContentTemplate> 
       <asp:Label ID="Label1" runat="server" Text="Before Click" /> 
       <asp:Button ID="Button1" runat="server" Text="Button1" OnClick="Button1_Click" CausesValidation="false"/> 
      </ContentTemplate> 
      <Triggers> 
       <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" /> 
      </Triggers> 
     </asp:UpdatePanel> 
     <asp:Button ID="Button2" runat="server" Text="Button2" OnClick="Button2_Click"/> 
    </form> 
</body> 
</html> 

hier Code meine WebForm1.aspx.cs

ist
namespace UpdatePanelTest2 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

      string currentthreadid = AppDomain.GetCurrentThreadId().ToString(); 
      string sessionid = Session.SessionID; 

      if (IsPostBack) { } 
      if (IsAsync) { } 
      if (IsPostBackEventControlRegistered) { } 

      if (ScriptManager1.IsInAsyncPostBack) { } 
     } 

     protected void Page_Init(object sender, EventArgs e) 
     { 

     } 

     protected void Button1_Click(object sender, EventArgs e) 
     { 
      this.Label1.Text = "After Click"; 
     } 

     protected void Button2_Click(object sender, EventArgs e) 
     { 

     } 
    } 
} 

meine Datei web.config

<?xml version="1.0"?> 

<!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 --> 

<configuration> 
    <system.web> 
     <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 

</configuration> 

UPDATE

Der Grund, warum ich es brauchen die gleiche Thread zu sein für Postbacks nennt, weil ich bestimmte Variablen erhalten und dann diese Variablen für den aktuellen Pool Thread wiederverwenden

Code:

private static readonly ThreadLocal<PageContext> _context = new ThreadLocal<PageContext>(typeof(PageContext), "_context", true); 
     private string[] _path; 

     public static PageContext ForCurrentThread 
     { 
      get { return _context.Value ?? (_context.Value = new PageContext()); } 
     } 

public void Initialize(HttpRequest _request) 
     { 
somestring = null; 
} 

public string somestring { get; set; } 

Wenn die Seite lädt die Beim ersten Mal erhält somestring einen Wert, andere Klassen verwenden denselben Kontext und verwenden diesen somestring-Wert erneut. Dies funktioniert nicht, wenn ein neuer Thread für Postback-Anforderungen erstellt wird.

+0

kann Ihre Frage nicht verstehen.Sie möchten Wert nur einmal speichern? –

+0

Es gibt einen ähnlichen Thread - bitte folgen Sie unten Link. http://stackoverflow.com/questions/222999/how-to-persist-variable-on-postback – meghlashomoy

+0

Welche Variable möchten Sie gleich bleiben? – smoksnes

Antwort

2

Dies ist von Entwurf. SessionID wird nicht gespeichert, bis Sie es tatsächlich verwenden.

https://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx

Wenn Cookie-basierte Sitzungsstatus verwenden, ASP.NET zuordnet nicht Speicher für Sitzungsdaten, bis die Session-Objekt verwendet wird. Als Ergebnis wird für jede Seitenanforderung eine neue Sitzungs-ID generiert, bis auf das Sitzungsobjekt zugegriffen wird.

Wenn Sie dies Ihren Code hinzufügen, die SessionID wird die gleiche bleiben:

Session["foo"] = 1; 

ASP.Net nicht garantieren Ihnen, den gleichen Thread für jede Anfrage zu bekommen. Die Anwendung arbeitet mit mehreren Threads und holt einen Thread aus dem Threadpool und verwendet ihn zur Verarbeitung der Anfrage.

Ich würde sagen, dass es nichts zu befürchten ist.

Ich würde vermeiden, Sachen für den spezifischen Thread zu speichern. Es gibt keine Möglichkeit zu wissen, ob Sie bei der nächsten Anfrage den gleichen Thread erhalten werden. Soll nicht stattdessen der Wert für den jeweiligen Benutzer gespeichert werden (zB Session)?

public static PageContext ForCurrentSession 
{ 
    get 
    { 
     if(Session["PageContext"] == null) 
     { 
      Session["PageContext"] = new PageContext(); 
     } 
     return Session["PageContext"] as PageContext; 
    } 
} 
+0

Vielen Dank! Ich denke, dieser ganze Ansatz ist falsch ...Wenn ich Sessions in einer Loadbalanced-Umgebung verwende, brauche ich eine DB. Ich werde die Art und Weise ändern, wie es funktioniert. Textvariablen wie Cookies und statische Sammlungen/Listen ... –

+0

Ja, ich denke, das ist eine gute Idee. Hanselman hat einen guten Blog über Session und mehrere Server. http://www.hanselman.com/blog/LoadBalancingAndASPNET.aspx – smoksnes

+0

ASP.Net garantiert nicht einmal, dass einzelne Anforderungen von einzelnen Threads behandelt werden. Sie können zwischen Threads springen, wenn sie Seitenlebensdauerereignisse durchlaufen und wenn der Anforderungshandler asynchron ist (Legacy-Stil oder 'async' /' erwarten'). –