2011-03-17 2 views
0

스레드 + b (두 파일을 모두 삭제하려고합니다). 이 먼저 호출되면 b이 아직 실행 중입니다. 은 파일을 성공적으로 삭제하지만 입니다.동시 스레드는 한 번에 하나만 작동하는 것처럼 보입니까?

을 단독으로 실행하면 의 파일이 정상적으로 삭제됩니다.

내가 코드를 단계별로 때 나는의의 MultiAttemptFilename이 B로 덮어 쓰기됩니다 '의 것을 볼 수 있습니다.

나는 이해할 수 없다.

파일 이름을 전달하는 일반 핸들러를 가리키는 ajax 호출이 있습니다. 내 처리기에서 나는 다음과 같은 코드를 가지고 그들이하지 않는

#Region "Delete" 

    Public MulitAttemptFilename As String = "" 
    Public Sub DeleteFileMulitAttempt() 
     Dim TimeBetweenAttempts As Integer = 2000 
     Dim NumberOfAttempts As Integer = 60 
     Dim AttemptNumber As Integer = 0 
     Dim Success As Boolean = False 
     While (AttemptNumber < NumberOfAttempts) 
      Try 
       Success = (DeleteFile(MulitAttemptFilename) = "Ok") 
      Catch ex As Exception 
       Success = False 
      End Try 
      If (Success) Then Exit While 
      Thread.Sleep(TimeBetweenAttempts) 
      AttemptNumber += 1 
     End While 
     End If 
    End Sub 

... 

이 취소 처리 할 수 ​​있습니다/업로드 실패 : 내 '문서'클래스에서

Dim Dc As New Document 
    Dim MyThread As New Thread(AddressOf Dc.DeleteFileMulitAttempt) 
    Dc.MulitAttemptFilename = Filename 
    MyThread.Start() 

을 나는이 다음 전화 했어 항상 즉시 삭제 (서버 잠금 등), 따라서 루프.

여기에 근본적인 것이 없습니까?

답변

1

멀티 스레드 동시성의 기본 개념이 누락 된 것처럼 보입니다. 이에 전념 한 책이 있으며, 종종 .NET 책의 섹션에서이 문제를 해결할 것입니다. 주제에 대한 설명은 one article by Microsoft입니다.

한 가지 간단한 대답은 VB의 "잠금"키워드를 사용해야한다는 것입니다. 당신은 개체를 만들고 당신은 내가 VB 말을하지 않는

lock(yourLockObject) 
{ 
    //any code that might access a shared resource like the variable 
    //MulitAttempFilename [sic] would go here. 
} 

같은 약 뭔가를하지만 당신이 정말로 전역 변수를 보호 할 필요가있는 한 가지를 만드는 것 같습니다. 글로벌 데이터는 어떤 형태로든별로 좋지 않은 아이디어이며, 멀티 스레딩의 경우 정말 나쁜 생각입니다. 삭제할 파일의 이름에 대한 액세스를 보호하려면 코드를 다시 작성해야합니다. 멀티 스레딩을 읽는 동안 스레드 풀에 대해 배우고 싶을 수도 있습니다.

+0

감사합니다. Tod. 나는 Synclock을 가지고 놀고 있었지만 기사를 읽었을 때 나는 스레딩을 제대로 읽을 시간이있을 때까지 이것을 부업으로 생각하고있다. 건배 – Oppdal

관련 문제