任务管理器上显示的许多“excel”流程 - 流程

时间:2011-04-26 17:36:46

标签: c# winforms memory-leaks

即使我的应用关闭并完成,当我在我的任务管理器上观看时 - >进程,那里 有许多excel进程甚至阻止我的计算机关闭。

这是我的代码:

 private void write_data_to_excel(byte[] input)
 {
    FileStream f = File.OpenWrite("StocksData.xls");
    f.Write(input, 0, input.Length);
    f.Close();
 }

造成这种情况的另一种可能方法:

private void get_stocks_data()
{
   byte[] result;
   byte[] buffer = new byte[4096];
   try
   {
      WebRequest wr = WebRequest.Create("http://www.tase.co.il/TASE/Pages/ExcelExport.aspx?sn=none&enumTblType=allShares&Columns=noneColumns&Titles=noneTitles&action=1&SubAction=0&GridId=33&CurGuid={0BDA5110-EF93-44CB-A0F0-468C6F502B51}&ExportType=1");
      using (WebResponse response = wr.GetResponse())
      {
         using (Stream responseStream = response.GetResponseStream())
         {
            using (MemoryStream memoryStream = new MemoryStream())
            {
               int count = 0;
               do
               {
                  count = responseStream.Read(buffer, 0, buffer.Length);
                  memoryStream.Write(buffer, 0, count);
               } while (count != 0);
               result = memoryStream.ToArray();
               write_data_to_excel(result);
            }
         }
      }
   }

我的代码还包含:

xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Open(file, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

这些方法被称为priodicly ... 我不闭门或......?

5 个答案:

答案 0 :(得分:2)

您需要尝试/捕获打开Excel应用程序和任何工作簿的代码,以及关闭打开的工作簿并退出应用程序的finally块:

    finally
    {
        if (wb != null) wb.Close();
        if (app != null) app.Quit();

        app = null;
    }            

请注意,如果您正在调试代码并在中间停止调试器,那么您仍将拥有Excel进程,因为finally块不会执行。

答案 1 :(得分:2)

您可以在此处找到答案:C# = Why are Excel processes not ending?

答案 2 :(得分:2)

我发现这样做最稳固的方法是使用以下方法释放工作簿中的每个工作表:

System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);

然后使用相同的调用发布Excel应用程序:

System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);

然后去做:

System.GC.Collect();
System.GC.WaitForPendingFinalizers();

答案 3 :(得分:2)

看看How to properly clean up Excel Interop objects in C#。使用Excel Interop时,需要非常小心清理所有COM对象。帖子中接受的答案将解释为什么你所做的是导致过程保持开放。重点是Never use 2 dots with com objects.

答案 4 :(得分:1)

有时,当COM应用程序泄漏时,对Marshal.ReleaseComObject()的调用可以解决问题