2013-09-06 4 views
0

입력 파일을 구문 분석하는 함수가 있습니다. 파일이 (getSvSpelOdds는 False를 반환)이없는 경우타이머를 사용하면 HttpContext.Current가 null이됩니다.

Private Function getSvSpelOdds(ByVal BombNo As Integer) As Boolean 

     Dim InputFileBase As String = HttpContext.Current.Application("InputFileBase") 
     strInputFile = InputFileBase & "PC_P7_D.TXT" 

     OddsReader = New StreamReader(strInputFile) 
     'some other code 
End Function  

, 나는 30 초 후에 다시 시도하고 싶습니다. 이것을 달성하기 위해 저는 타이머를 사용합니다.

If Not getSvSpelOdds(y) Then 
      Timer1.Interval = 30000 
    End If 

Private Sub Timer1_Elapsed(sender As Object, e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed 

    getSvSpelOdds(y) 
End Sub 

문제 타이머 (gloal 변수의 값을 얻기 위해 사용됨)를 발생 HttpContext.Current 때 널이다.

이 방법을 사용하려면 다른 방법을 사용해야합니까?

+0

가능한 중복 (는 타이머 콜백에서 작동하지 않는 이유에 대해) 질문의 다른 부분을 해결하기 위해 보인다 어떻게 HttpContext.Current 멀티 스레드 환경에서 작업 ?] (http://stackoverflow.com/questions/1561036/how-does-httpcontext-current-work-in-a-multi-threaded-environment) –

답변

0

이미 설명한 바와 같이 Timer_Elapsed가 다른 스레드에서 호출되면 HttpContext는 null이어야합니다. 그러나 System.Web.HttpRuntime.Cache를 사용하여 파일 이름을 전달할 수 있으며 모든 스레드에서 캐시에 액세스 할 수 있어야합니다.

0

HttpContext.Current 들어오는 스레드를 처리하는 스레드에서 호출 할 때 원하는 컨텍스트 만 제공합니다.

이러한 스레드 외부에서 호출하면 null이됩니다. Timer1_Elapsed가 새 스레드에서 실행될 때 사건과 일치합니다.

0

타이머의 Elapsed 이벤트는 별도 스레드에서 실행되므로 현재 컨텍스트에 대해 예상되는 동작이 null이됩니다.

동일한 스레드에서만 액세스 할 수 있습니다.

이 방법을 사용하려면 다른 방법을 사용해야합니까?

예, ASP.NET이 작동하는 방식이 복잡하기 때문에 ASP.NET과 스레드를 혼합하는 것이 일반적으로 좋지 않습니다. 이미 언급했듯이 30 초 동안 아무런 피드백도 얻지 못하는 위대한 UX가 아니라 실제로 무슨 일이 일어나는지 사용자에게 알려주는 것이 좋습니다.

또한 시간 초과 길이가 적절한 지 또는 시간 초과가 필요한지 여부를 결정해야합니다. 응용 프로그램의 성격을 모르지만 사이트에서 파일을 생성하고 선택할 수있는 외부 수단이 있다고 가정합니다.

0

이 방법을 사용하려면 몇 가지 다른 방법을 사용해야합니까?

거의 확실합니다. 30 초는 사용자에게 아무런 피드백도주지 않고 기다리는 데 오랜 시간이 걸립니다.

"결과가 아직 없지만 아직 찾고 있습니다"라는 메시지를 사용자에게 반환하는 것이 좋습니다. 이 페이지는 적절한 메타 태그를 추가하여 30 초 후에 자동으로 새로 고침되도록 설정할 수 있습니다.

<META HTTP-EQUIV="refresh" CONTENT="30"> 

그런 다음 서버에서 새로운 요청/응답주기를 얻습니다. 그동안 서버 리소스를 묶어 두지 않았습니다.


다른 답변 [의

관련 문제