2011-02-15 3 views
2

저는 파일에 데이터를 쓰는 것을 만들고 있습니다. 이제 내가 직면하고있는 문제는 응용 프로그램이 종료되고 파일 쓰기 작업이 중간에 매달려 있다는 것입니다. 나는 일련의 사물들이 완전히 쓰여지거나 전혀 쓰이지 않기를 원한다. 그러나 응용 프로그램이 종료되고 그 중 절반 만 가끔 작성됩니다. 내가 여기서 뭘 잘못하고 있는지에 대한 제안은? 감사.응용 프로그램이 중간에 파일 작업을 남기지 않고 종료하는 것을 방지합니다.

+2

** ** 응용 프로그램이 종료되는 이유는 무엇입니까? 예외가 발생 했습니까? (있는 경우 어떤 것입니까?) 또는 종료하라는 지시 *입니까? –

답변

2

여기에 갈 정도가 아니다 ...하지만 ...

당신은 제대로 파일 스트림을 플러시하고 있습니까?

완전히 완성되기 전에 프로그램을 끝내고 있지만 닫을 수는 있습니다.

+1

매우 정확한 경우 스트림이 작성되는 즉시 플러시하고 매우 일반적인 방법이므로 응용 프로그램이 –

+0

+1에서 무 바시르의 제안 (작성된 즉시 플러시)을 종료하면 파일이 제대로 닫혀 있는지 확인하십시오. 나중에 성능 문제가 발생할 수도 있지만, 여러 가지 방법으로 플러싱을 조절할 수있는 것은 쉽지만, 계획 단계에서 걱정할 필요가없는 것은 아닙니다. 기능적으로 정확한 프로그램> 빠른 프로그램 !! :) – corsiKa

1
try { 
    // Open file, start writing... 
} 
catch (Exception e) 
{ 
    // Close file and discard it (if that's what you want), log error with e.ToString() 
} 
// Close file 
0

당신은 아마 try/catch 블록에 걸려와 "먹을"되는 예외가 있습니다. 디버거 (Debug-> Exceptions-> Common Language Runtime)에서 예외 처리를 활성화하고 두 확인란을 모두 선택하십시오.

+0

Hehehe는 붙잡았다 :) 화요일의 아침에 나를 미소 짓게했던 미안! – corsiKa

0

예를 들어 WinForm을 봅시다. 사용자가 Click 이벤트 (또는 Form_Closing 같은 다른 이벤트)에서 오른쪽 상단 모서리에있는 X 버튼 (또는 다른 버튼을 클릭하여 종료)을 클릭하면 File_Operation_Thread의 상태를 확인합니다 (나는 Thread/파일을 조작하려면 BackgroundWorker을 입력하십시오. 그렇지 않으면 UI가 중단됩니다. 스레드가 실행 중이면 "작업을 처리 중입니다"라는 대기/취소 단추가있는 대화 상자를 표시하십시오. 최종 구현은 다음과 같습니다.

BackgroundWorker worker = new BackgroundWorker(); 
void WriteButton_Clicked(object sender, EventArgs args) 
{ 
    //start writing to the file asynchronously, something like 
    //worker.DoWork += (s,e) => { /*writing to file*/ }; 
} 

void ExitButton_Clicked(object sender, EventArgs args) 
{ 
    if (worker.IsBusy) 
    { 
     //show a dialog window 
     if (CANCEL) 
     { 
     worker.CancelAsync(); 
     //but rolling the changes back is a nightmare!! 
     } 
     else 
     { 
     //exit the applcation when worker.RunWorkerCompleted 
     } 
    } 
} 
관련 문제