2014-07-21 2 views
2

텍스트 파일에 쓰는 코드가 있습니다. 이 파일에 기록하도록되어있는 유일한 과정을 활성화하고, 다음에 방법이File.AppendAllText 다음에 파일이 계속 열려 있습니다.

try 
{ 
    File.AppendAllText(path, '\n' + tmp); 
} 
catch (Exception) 
{ 
    lblError.Text = "Unable to save file"; 
} 

이 잘 시간의 절반처럼 작동합니다. 그러나 때로는 파일이 다른 프로세스에서 사용되고 있다는 예외를 throw합니다. 어떤 프로세스가 파일을 사용했는지 조회했습니다. 그 파일은 w3wp.exe입니다. 나는 그것이 완료되면 파일을 닫습니다 File.AppendAllText 읽었습니다, 그래서 그것을 해본 것처럼 잘되어야합니다. 권리?

편집 : 목적의

설명 요청, 그래서 여기에 표시됩니다. 코드의이 부분은 다른 프로세스가 사용할 구성 텍스트 파일에 한 줄을 추가해야합니다. 그 프로세스가 현재 실행되고 있지 않다는 것을 100 % 확신합니다.

또한이 코드는 asp.net 응용 프로그램 (코드 숨김)이라는 것을 추가 할 수도 있습니다. 따라서 사용자는 ASP 페이지에서 config.txt에 쓸 수 있습니다.

static readonly object saveLock = new object(); 
/* 
* stuff 
*/ 
protected void saveToConfig(string input) 
{ 
    lock(saveLock) 
    { 
     File.AppendAllText(path, '\n' + input); 
    } 
} 

을하지만 난 여전히 여러 프로세스가 파일에 액세스하려고하는 것을 말하는 IOException이 오류를 얻을 :

나는 이것을 시도했습니다.

+1

당신이'대로를 나는 당신이 (다중 스레드 환경에서 IIS에 여러 요청 추측 w3wp.exe') => 두 개의 스레드가 병렬로 파일에 액세스하고 있습니까? – ChrFin

+0

그럴 것 같습니다. 코드의 대부분이 내 작업이 아니기 때문에 나는 실제로 확신 할 수 없다. ^^. 그렇다면 단순한 자물쇠 만 있으면 충분할까요? –

+0

예, 자물쇠가 도움이 될 것입니다,하지만 기본 디자인 결함이 있다고 생각합니다 ... – ChrFin

답변

3

당신이 실패하면 쓰기를 반복 일부 로직 만들 Palmer을 사용할 수

Retry.On<IoException>().For(TimeSpan.FromSeconds(15)).With(context => 
    { 
     File.AppendAllText(path, '\n' + tmp); 
    }); 
+0

당신의 도움에 감사드립니다 =) –

관련 문제