2010-05-06 29 views
7

Ở dạng của tôi, tôi đang làm một cái gì đó đơn giản nhưC# Excel Interop: Quá trình Excel vẫn còn trong bộ nhớ cho đến khi form cha đóng

private void btnPrintPickList_Click(object sender, EventArgs e) 
{ 
    using (var salesRpt = new SalesOrder(CurrentItem())) 
    { 
     salesRpt.CreateSpreadSheet(); 
     salesRpt.Dispose(); 
    } 
} 

Tôi đã theo "no 2 chấm cai trị cho excel interop".

protected ExcelSheet(bool documentVisible, XlPageOrientation orientation) 
{ 
    ExcelApplication = new Application {Visible = documentVisible}; 
    WorkBooks = ExcelApplication.Workbooks; 
    WorkBook = WorkBooks.Add(XlSheetType.xlWorksheet); 
    SheetList = WorkBook.Worksheets; 
    Orientation = orientation; 
    WorkSheet = (Worksheet) ExcelApplication.ActiveSheet; 
} 

public Application ExcelApplication { get; private set; } 
public Workbook WorkBook { get; private set; } 
public Workbooks WorkBooks { get; private set; } 
public Worksheet WorkSheet { get; private set; } 
public Sheets SheetList { get; private set; } 
public XlPageOrientation Orientation { get; private set; } 

phương pháp xử lý thực hiện như sau.

public void Dispose() 
    { 
     for (int i = 1; i <= SheetList.Count; i++) 
     { 
      Marshal.FinalReleaseComObject(SheetList[i]); 
     } 
     //Marshal.FinalReleaseComObject(WorkSheet); 
     Marshal.FinalReleaseComObject(SheetList); 
     Marshal.FinalReleaseComObject(WorkBook); 
     WorkBooks.Close(); 
     Marshal.FinalReleaseComObject(WorkBooks); 
     ExcelApplication.Quit(); 
     Marshal.FinalReleaseComObject(ExcelApplication); 
     WorkSheet = null; 
     SheetList = null; 
     WorkBook = null; 
     WorkBooks = null; 
     ExcelApplication = null; 
    } 

Trong quá trình thử nghiệm, quá trình EXCEL.exe không nhất quán bị xóa khỏi quy trình hiện tại trên thanh tác vụ khi bảng tính Excel được in.

Tôi đang làm gì sai?

Trả lời

3

Các bạn đã thử gọi GC.Collect()?

Ngoài ra, bạn có thể sử dụng using{} nếu bạn không muốn để buộc một thu gom rác thải trực tiếp của tất cả các thế hệ

+0

Tôi đã sử dụng các "sử dụng" tuyên bố và phương thức Dispose không được gọi và hoàn thành nhưng EXCEl.exe không đi ra khỏi trình quản lý tác vụ cho đến khi tôi đóng biểu mẫu. Tôi sẽ thử GC.collect() vào cuối cùng của việc vứt bỏ. –

+0

Thêm GC.Collect(); vào cuối Dispose() đã xóa EXCEl.exe khỏi trình quản lý tác vụ. Một điểm. Tôi đã nghe nói nó không phải là khuyến khích để gọi GC.Collect(). Có hợp lệ trong trường hợp interop không? –

+0

Thật không may, tôi không nghĩ rằng có một lựa chọn khác cho kịch bản này! –

Các vấn đề liên quan