2011-11-07 3 views
0

VS2010, C#을 사용하여 ASP.NET 웹 응용 프로그램을 개발하고 때로는 공개 코드 또는 공용 정적 변수를 내 코드 숨김 파일의 시작 부분에 선언해야 할 수 있습니다. 파일에서 전역 적으로 액세스하고 포스트 백간에 값을 보존하므로 내 로컬 서버에서 모든 것이 올바르게 작동합니다 (코드를 실행하는 유일한 사람). 그러나이 페이지 (및 그에 대한 코드 숨김)가 동시에 여러 웹 사이트 방문자에 의해 실행될 때 어떤 일이 발생하는지 정확히 알지 못합니다. 내 프로그램이 모든 사용자에게 동일하게 실행되기를 원하지만이 방법으로 문제를 일으키는 내 이전 ASP.NET 경험에서 codebehind에서 변수 (public 또는 public static)를 사용하면 웹 사용자의 오해가 발생할 수 있음을 기억할 수 있습니다. 사용자 A는 프로그램 (public static int) my_int를 실행합니다. 시동시 -1의 값을 100으로 취한 경우 사용자 B는 동일한 페이지를 실행하므로 my_int는 100이며 문제가 발생하며 my_int가 100 인 동안 사용자 A가 페이지를 떠난다 고 가정합니다. 사용자 B는 예기치 않은 동작이 발생할 것이라고 생각하기 위해 처음에는 my_int가 100이 될 것입니다 (-1 인 경우).다른 사용자의 ASP.NET 변수 값

맞습니까? 이것은 전혀 일어날 것인가? 그렇다면 어떻게 그것을 막을 수 있습니까? 변수 대신 세션을 사용해야합니까? 당신은 데이터가 저장되는 범위에 따라 스토리지를 선택해야합니다 - 내가 어떻게 모든 상황에 대한 더 나은 이해

덕분에 친구

+0

로컬 호스트에서 앱을 개발할 때 변수가 값과 알고리즘이 잘 작동하지만 모든 것이 잘 작동한다고하지만 현재 사이트를 운영하는 유일한 사람이므로 생각합니다. 많은 사용자가 동시에 내 페이지에 액세스 할 때 문제가 발생합니다. –

+0

@rahularyansharma 작업자 프로세스가 재설정되지 않은 경우 정적 변수가 정의에 따라 수행됩니다. –

답변

1

간단한 규칙을 가질 수 있습니다. 그리고 변경할 수있는 (읽기/쓰기) 공유 상태의 경우 동시 액세스 (스레드 안전)에 대해 걱정할 필요가 있습니다. 예를 들어 변수가 정적 인 경우 전체 응용 프로그램 (올바르게 말하면 app-domain)에서 사용할 수 있지만 변수를 읽거나 쓰는 동안 스레드 안전성을 보장한다는 의미이기도합니다. 몇 가지 팁이 있습니다.

  1. 요청 범위 당 로컬 변수를 사용하십시오. 스레드 안전성은 필요 없습니다 (요청 스레드 만 액세스 가능).
  2. 페이지 범위 당 (반복되는 포스트 백 이상) 뷰 상태를 사용하십시오. 스레드 안전성은 필요 없습니다 (요청 스레드 만 액세스 가능).
  3. 사용자 범위에 따라 세션 상태를 사용하십시오. 세션 상태에 대한 좋은 점은 thread-safety (ASP.NET은 그 일을 처리)에 대해 걱정할 필요가 없다는 것입니다.
  4. 넓은 범위 (엄격히 말하면 앱 도메인 범위)의 경우 응용 프로그램 상태 또는 정적 변수를 사용하십시오. 응용 프로그램 상태는 스레드 안전을위한 잠금/잠금 해제 API를 제공하지만 정적 변수의 경우 자체 잠금 메커니즘을 제공합니다. 정적 변수는 응용 프로그램 전체의 읽기 전용 데이터에 유용합니다. 즉, 응용 프로그램이 시작될 때 초기화하고 쓰기가 없기 때문에 필요할 때마다 정보를 사용합니다.
  5. 이보다 큰 범위의 경우 데이터베이스 (또는 다른 영구 데이터 저장소)를 사용하십시오. 데이터베이스의 경우 일관성을 유지하기 위해 트랜잭션이 사용됩니다.
+0

감사의 친구, 내 대답을 찾은 것 같아서 코드에 몇 가지 변경 사항을 적용해야합니다! –