C# 用の Office Interop ライブラリを使用するアプリケーションがあります。
このライブラリは、IIS7 でホストされている ASP.NET アプリケーションから呼び出されます。
関連するコード ビットは次のとおりです。
/// <summary>
/// Provides excel functions.
/// </summary>
public class ExcelStuff : IDisposable
{
#region Excel Components
// The following are pre-allocated Excel objects that must be explicitly disposed of.
private Excel.Application xApp;
private Excel.Workbooks xWorkbooks;
private Excel.Workbook xWorkbook;
private Excel.Sheets xWorksheets;
private Excel.Worksheet xWorksheet;
private Excel.ChartObjects xCharts;
private Excel.ChartObject xMyChart;
private Excel.Chart xGraph;
private Excel.SeriesCollection xSeriesColl;
private Excel.Series xSeries;
#endregion
/// <summary>
/// Initializes a new instance of the <see cref="ExcelStuff" /> class.
/// </summary>
public ExcelStuff()
{
}
/// <summary>
/// Does some work.
/// </summary>
public void DoWork()
{
byte[] data = new byte[0];
worker = new Thread(() =>
{
// Do some work.
});
worker.Start();
worker.Join();
worker.Abort();
worker = null;
Dispose();
}
/// <summary>
/// Disposes the current object and cleans up any resources.
/// </summary>
public void Dispose()
{
// Cleanup
xWorkbook.Close(false);
xApp.Quit();
// Manual disposal because of COM
xApp = null;
xWorkbook = null;
xWorksheets = null;
xWorksheet = null;
xCharts = null;
xMyChart = null;
xGraph = null;
xSeriesColl = null;
xSeries = null;
GC.Collect();
}
}
コードに多くの冗長性があることに気付くでしょう。これは、この問題を解決するための私の必死の試みです。ですから、呼び出すのが非効率的だGC.Collect()
とかDispose()
、クラス内から呼び出すのは良くないとか言わないでください - 私はこれらのことをすでに知っています。
私が知りたいのは、EXCEL.exe
できるだけ多くのオブジェクトをクリーンアップするために最善を尽くしているときに、このコードが孤立したプロセスをサーバー上で実行し続ける理由です。