2012-05-04 5 views
2

현재 Windows Phone 7 응용 프로그램을 해당 웹 버전으로 변환하고 있습니다. 이 응용 프로그램은 데이터가 수집되는 큰 주 스레드를 사용하며 잠시 동안 ASP.NET MVC 컨트롤러에서 그대로 복사 한 후 붙여 넣습니다 (표준 스레드 작업).ASP.NET MVC 3 스레딩

Sync _Sync = new Sync(); 
_Sync.StartSync(); 

작업은 확인을 작동하지만 스레드가 쿠키에서 설정 한 글로벌 데이터의 사용을 만들기 때문에 2 개의 다른 사용자 이름과 페이지에 액세스 할 때 문제가 발생한다. 예를 들어, Firefox에서 "user1"으로 로그인 한 다음 다른 사용자 (예 : "user2")와 Chrome에서 로그인을 시도하면 첫 번째 사용자에 대해 수집 된 비동기 데이터가 자동으로 변경됩니다. 즉, 내가 마지막으로 로그인 한 사용자 (처음에는 다른 사용자와 함께 Firefox에 로그인했다는 사실에 관계없이)에서 데이터를 빼내는 것을 볼 수 있으며 서로의 데이터가 아닌 다른 데이터를 볼 수 있습니다.

즉, 개별 사용자마다 개별적으로 스레드가 시작되지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?

+0

'동기화'유형은 사용자 데이터를 저장하기위한 '정적'필드 또는 속성을 사용합니까? –

+0

"쓰레드가 쿠키의 글로벌 데이터 세트를 사용합니다"이것은 나에게 좋지 않을 것입니다. 아마도 여러분이'Sync' 객체를 생성 할 때, 당신은 그것을 특정 사용자에게 유일하게 묶는 값을 할당 할 수 있습니다. 전역을 사용합니다. – Matthew

+1

@ChrisShouts 예, 동기화에 필요한 모든 전역 입력란은 정적 개체에 유지됩니다. 매번 새로운 인스턴스를 만들어야합니까? – Kyprulez

답변

3

Static 필드 및 속성은 스레드간에 공유되므로 일반적으로 특정 사용자 또는 웹 요청과 관련된 데이터를 저장하는 데 사용해서는 안됩니다.

다음 제안 사항 중 하나가 스레딩 문제를 해결하고 사용자 데이터를 분리해야합니다.

  • 는 각 요청에 대한 Sync 클래스의 인스턴스를 생성하고 클래스에서 어떤 static 필드/속성을 제거합니다.
  • static 필드/속성에 데이터를 저장하는 대신 특정 사용자의 데이터 인스턴스를 반환하는 메서드를 Sync 클래스에 추가합니다.
+0

실제로 정적 필드를 변경하면 문제가 해결됩니다. 고마워요! – Kyprulez