2012-08-24 19 views
0

Excel 파일 및 출력 Excel 파일에서 읽는 일부 C# 프로그램을 작성했습니다. 그러나 하루가 끝날 때 프로그램이 종료되고 모든 파일이 닫힌 후에 많은 Excel 프로세스가 계속 실행되고 있음을 발견했습니다. 다음은 파일 작성 및 종료 처리 방법입니다.프로그램 종료 후 Excel 프로세스가 계속 실행 중입니다.

Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); 
Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet); 
Worksheet ws = (Worksheet)wb.Worksheets[1]; 
... 
wb.Close(true, saveDirectory + "\\" + reportName, false); 
xlApp.Quit(); 
Marshal.ReleaseComObject(wb); 
Marshal.ReleaseComObject(xlApp); 
this.Close(); 

누락 된 항목이 있습니까? 모든 조언을 부탁드립니다.

감사합니다.

+0

나는 꽤 똑바로 보인다. 아마도 여러분은 여러분의 PC에서 프로세스를 보면서 1000 회 정도의 반복을 반복하는 짧은 콘솔 프로그램을 작성할 수 있습니다. 내 추측은'...'섹션에 표시되지 않은 것이 문제의 원인이 될 수 있습니다. – jp2code

+0

난 당신이 내가 변경 한 http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects-in-c-sharp – MiiisterJim

답변

3

코드가 모든 COM 참조를 해제하지 않습니다 (예 : xlApp.Workbooks.Add은 출시되지 않은 Workbooks 개체에 대한 참조를 만듭니다). 따라서 Excel 인스턴스는 this KB article에서 설명한대로 닫히지 않으며 수많은 StackOverflow 질문에서 오랫동안 토론되었습니다.

Excel 인스턴스는 프로세스가 종료 된 후 COM이 잠시 동안 클라이언트의 Ping이 없음을 감지하면 결국 종료됩니다.

+0

여기에 답변을 찾을해야한다고 생각 'Marshal.ReleaseComObject (wb); (Marshal.ReleaseComObject (wb)! = 0) {Marshal.ReleaseComObject (wb);} 그 트릭을 할 것인가? – Kevin

+0

@ 케빈 - 아니, 충분하지 않을거야. 'xlApp.Workbooks.Add'를 사용하여 참조하는 Workbooks 객체를 해제하지 않습니다. 또한 예외가 발생하더라도 객체를 해제하려면'try/finally'를 사용해야합니다. – Joe

관련 문제