ASP.NET 정적 변수의 수명
페이지 클래스(Global.asax가 아님)에 정의된 정적 변수에 일부 정보를 보관하고 있습니다.다음과 같은 코드에서만 변수를 선언합니다.
protected static int SomeGlobalUnsecureID;
protected static string SomeGlobalUnsecureString;
및 PageLoad 이벤트에서 변수를 정의합니다.예를 들어 데이터베이스의 ID가 SomeGlobalUnsecure와 다른 경우 확인합니다.ID, 일부 GlobalUnsecure 업데이트다른 곳에서 온 ID와 String을 그대로 유지합니다.이것은 내 앱에서 완벽하게 안전합니다.논리(즉, 그러한 데이터는 안전하지 않고, 모든 사람이 액세스할 수 있으며, 문제가 없음); 내가 달성하고 싶은 유일한 것은
연결된 사용자에 관계없이 동일한 양의 메모리 보유
영구 정보가 '메모리'의 정보와 다른 경우에만 변경합니다(실제로 문자열을 읽는 데 시간이 걸리기 때문에).
이제 PageLoad에서 체크를 하기 때문에 다시 로드된 페이지에는 문제가 없습니다.하지만 제 페이지는 웹 메소드로 가득 차 있고 정적 변수가 0으로 표시되는 경우도 있습니다.그리고 이상한 부분은 정적 변수가 0이 되어도 세션이 여전히 활성화된다는 것입니다(따라서 서버나 앱이 없음, 풀 다시 시작 등).
이것은 저에게 정말 이상한 일입니다.정적 변수는 애플리케이션이 종료될 때까지(어떤 식으로든) 값을 유지할 것으로 가정합니다.그러나 세션이 만료되지 않은 경우에도 정적 변수는 0이 됩니다.당신은 무엇을 제안합니까?애플리케이션 변수를 사용하는 것이 더 나은 선택입니까?제가 웹에서 읽은 모든 문서는 응용 변수 대신 정적 변수를 제안하는데, 어떻게든 다르게 선언해야 하나요?
정적 변수는 앱 도메인의 수명 동안 지속됩니다.따라서 정적 변수가 '재설정'되는 두 가지 이유는 앱 도메인 재시작 또는 새 클래스 사용입니다.정적 변수가 aspx Page 클래스에 저장된 경우 ASP.NET이 aspx Page를 새 클래스로 다시 컴파일하여 이전 페이지 클래스를 새 클래스로 바꾸기로 결정할 때 정적 변수가 손실될 수 있습니다.
이러한 이유로 시스템이 클래스를 다시 시작하거나 바꾸기로 결정하면(.NET은 실행 중인 앱 도메인의 클래스/어셈블리를 끄거나 언로드하지 않음) 다시 시작하거나 바꾸기를 사용하여 새 클래스를 받기 때문에 정적 변수가 재설정됩니다.이는 aspx 페이지와 App_Code 폴더의 클래스 모두에 적용됩니다.
ASP.NET은 어떤 이유로든 클래스를 다시 컴파일해야 한다고 생각되는 경우 클래스를 대체합니다(ASP.NET 동적 컴파일 참조).
앱 도메인 재시작으로 인한 정적 변수의 손실을 방지할 수는 없지만 클래스 교체에서는 이를 방지할 수 있습니다.정적 변수를 aspx 페이지가 아니고 App_Code 디렉터리에 없는 클래스에 넣을 수 있습니다.여러분은 을 위에배것좋다습니이에 .static class프로그램 어딘가에 있습니다.
public static class GlobalVariables
{
public static int SomeGlobalUnsecureID;
public static string SomeGlobalUnsecureString;
}
정적 변수는 풀당 있습니다. 즉, asp.net 사이트를 실행하는 풀이 2개인 경우 두 개의 서로 다른 정적 변수가 2개인 것입니다.(웹 가든 모드)
시스템이 이러한 방법 중 하나로 asp.net 응용 프로그램을 다시 시작하면 정적 변수가 손실됩니다.
- 재컴파일이 필요한지 결정합니다.
- app_offline.htm 파일을 엽니다.
- 풀을 수동으로 다시 시작하는 경우
- 풀이 사용자가 정의하고 다시 시작하는 몇 가지 제한에 도달했습니다.
- 어떤 이유로든 iis 또는 풀을 다시 시작합니다.
이 정적 변수는 스레드에 안전하지 않으므로 다른 스레드에서 액세스하는 경우 특히 lock 키워드를 사용해야 합니다.
앱을 다시 시작하면 통계가 재설정되므로 데이터를 유지하려면 사용자 지정 클래스를 사용하여 데이터베이스에 데이터를 저장해야 합니다.데이터베이스 세션 상태 모드를 사용하여 세션 상태에서 사용자별 정보를 저장할 수 있습니다. ASP.NET 응용 프로그램 상태/변수는 데이터베이스가 아닌 메모리에 저장되므로 도움이 되지 않으므로 앱 도메인을 다시 시작할 때도 손실됩니다.
정적 변수의 수명에 대해서도 다음 두 가지 사항이 중요하다고 생각합니다.
1 - 응용프로그램 풀의 고급 설정에서 "재활용" -> "정기간격(분)" 설정을 확인합니다.기본값은 1740입니다. 즉, 29시간마다 애플리케이션 풀의 재활용으로 인해 정적 변수가 손실됩니다.이 설정은 가능한 메모리 누수를 종료하는 데 사용됩니다.이 설정을 변경하지 않습니다.
2 - 응용 프로그램 풀의 고급 설정에서 "프로세스 모델" -> "유휴 시간 제한(분)" 설정을 확인합니다.기본값은 20입니다. 즉, 응용 프로그램 풀에서 20분 동안 작업이 없을 때마다 작업자 프로세스가 종료/일시 중단되어 정적 변수가 손실됩니다.이 설정은 응용 프로그램 풀이 일정 시간 동안 사용되지 않을 때 리소스를 확보하는 데 사용됩니다.0으로 설정하여 시간 초과를 사용하지 않도록 설정할 수 있습니다.
정적 변수는 모든 개체를 동일한 값으로 저장하는 데 사용됩니다.
protected void Page_Load(object sender, EventArgs e)
{
sss s1, s2;
s1 = new sss();
s1.TotalMark = 10;
s2 = new sss();
s2.TotalMark = 20;
sss.SchoolName = "St.Joseph's Hr.Sec.S"; //We can access through class and assign common to all
s1.PrintData();
s2.PrintData();
}
public class sss
{
public static string SchoolName { set; get; }
public int TotalMark { set; get; }
public string StudentName{set;get;}
public void PrintData()
{
Console.WriteLine(TotalMark);
Console.WriteLine(SchoolName);
Console.WriteLine(StudentName);
}
}
언급URL : https://stackoverflow.com/questions/8919095/lifetime-of-asp-net-static-variable
'programing' 카테고리의 다른 글
| Firestore 데이터 가져오기 시 성능 저하 문제 발생 (0) | 2023.06.09 |
|---|---|
| CSV 또는 JSON을 Firebase 클라우드 Firestore로 가져오는 방법 (0) | 2023.06.09 |
| SQL Server의 기본 포트 (0) | 2023.06.09 |
| UI 텍스트 필드 텍스트를 수직으로 중앙에 배치하려면 어떻게 해야 합니까? (0) | 2023.06.09 |
| 상태가 계산에서 업데이트되지 않는 이유는 무엇입니까? (0) | 2023.06.09 |