2012-04-07 5 views
0

아래에서 볼 수 있듯이 Parallel.For 루프가 있습니다. 파일이 존재하지 않을 때 프로그램을 실행하면 "다른 프로세스에서 사용 중이기 때문에 'C : \ ShowTime Error Logs \ logFile.txt'파일에 액세스 할 수 없습니다."와 같은 오류가 발생합니다.어떻게 "다른 프로세스에서 파일을 사용하고 있기 때문에 프로세스가 파일에 액세스 할 수 없습니다."오류

그러나 파일이 존재하면 오류가 없습니다. 혼란 스럽네요, 내 코드는 파일이 존재하지 않더라도 이미 파일을 만듭니다. 왜 프로그램을 실행하기 전에 파일이 존재하지 않으면 오류가 발생합니다. 어떻게 해결할 수 있습니까?

들으

ErrorLog el = new ErrorLog(); 
     Parallel.For(0, 100000, delegate(int i) 
    { 
     el.WriteToShowTimeLog("logFile", "", "", (i).ToString(), "", "", @"C:\"); 
    }); 

오류 로그 클래스는, 그렇지 않으면 당신은 동시에 두 개의 별도의 스레드에서 그것을 만들 수 있습니다, 당신은 잠금에서 확인 및 작성 파일을 포함 할 필요가

private static readonly object lock_ = new object(); 
    public void WriteToShowTimeLog(string fileName, string errorMessage, string description, string movieID, string theaterID, string showTimeDate, string folderPath) 
    { 
     string filePath = folderPath + @"\ShowTime Error Logs\" + fileName + ".txt"; 
     lock (lock_) 
     { 

      if (!Directory.Exists(folderPath + @"\ShowTime Error Logs")) 
      { 
       Directory.CreateDirectory(folderPath + @"\ShowTime Error Logs"); 
      } 

      if (!File.Exists(filePath)) 
      { 
       File.Create(filePath); 
      } 

      using (StreamWriter dosya = new StreamWriter(filePath,true)) 
      { 

       dosya.WriteLine("TheaterID:  " + theaterID); 
       dosya.WriteLine("MovieID:   " + movieID); 
       dosya.WriteLine("Show Time Date: " + showTimeDate); 
       dosya.WriteLine("Hata Mesajı:  " + errorMessage); 
       dosya.WriteLine("Açıklama:   " + description); 
       dosya.WriteLine("Hata Alınan Zaman:" + DateTime.Now); 
       dosya.WriteLine("-------------------------------------------------------------------------------------------------------"); 
       dosya.Close(); 


      } 
     } 
    } 

답변

2

변수 함수와 정적을 가지고 오류가 발생합니다.

편집

File.Create는 열려있는 파일을 반환합니다. 그런 다음 StreamWriter가 다시 열려고합니다. 스트림 작성자가 StreamWriter를 만들고 StreamWriter에 대해 다시 만들어야하는 대신에 사용할 간단한 옵션을 설정해야합니다.

+0

시도했지만 결과가 동일합니다, 나는 또한 검사 및 생성 파일을 병렬 루프 전에 전에 시도했다. – Bilgehan

+0

@Bilgehan : 무엇이 잘못되었는지를 알 수 있도록 수정 된 코드를 보여줍니다. –

+0

코드를 편집했습니다. 감사합니다 – Bilgehan

1

잠금 장치 외부의 모든 항목은 모든 스레드에서 임의의 순서로 실행할 수 있습니다. 반대로 가정하지 마십시오. 이 경우 파일이 있는지 스레드 # 1 검사가있을 수 있습니다. 이후, 그것은 절을 입력하고 스레드 # 2 이상 걸립니다. 스레드 # 2는 파일이 존재하는지 확인합니다. 이후 스레드 # 2도 if 절을 입력하고 파일을 만듭니다. 스레드 # 1이 다시 인계되면 깜짝! 파일이 존재하지 않는다고 "막"확인 했더라도 이미 파일이 생성되었습니다.

대부분의 출력 스트림은 데이터가 부어 진 파일을 자동으로 생성하므로 해당 섹션이 필요하지 않을 수도 있습니다.

+0

+1 마지막 문장을 지원하는 [link] (http://msdn.microsoft.com/en-us/library/36b035cb.aspx) –

+0

@Neil 코드를 수정했지만 동일합니다. . 고마워 – Bilgehan

관련 문제