2012-08-14 39 views
2

我在后台离开excel僵尸进程的程序出现问题。我已经遵循了所有的建议和例子,以及试图避免这种情况的MSDN,但这让我感到非常紧张。任何人都可以发现是什么导致僵尸进程发生?(另一种).net Excel僵尸问题

Imports System 
Imports System.Collections 
Imports System.IO 
Imports Excel = Microsoft.Office.Interop.Excel 

私人小组LoadExcelButton_Click(BYVAL发件人为System.Object的,BYVALË作为System.EventArgs)把手LoadExcelButton.Click

Dim xlApp As New Excel.Application 
    Dim xlBook As Excel.Workbook = Nothing 'instantiated to nothing to help try and avoid zombies 
    Dim xlSheet As Excel.Worksheet = Nothing 
    Dim STFRange As Excel.Range = Nothing 

    Dim Name As String, Easting As Integer, Northing As Integer, tDSpa As Double, Type As String 

    Dim NumberSTF As Integer, NumberProperties As Integer, i As Integer, ExcelPath As String 

    ExcelPath = Me.ExcelPathTextBox.Text.ToString 

    If File.Exists(ExcelPath) = False Then 
     MessageBox.Show("Excel file does not exist, exiting.") 
     Exit Sub 
    End If 

    Try 

     xlApp.Visible = False 

     xlBook = xlApp.Workbooks.Open(ExcelPath) ', , [ReadOnly]:=True 

     xlSheet = xlBook.Sheets("STF") 

     NumberSTF = xlSheet.UsedRange.Rows.Count - 1 '-1 to account for header 
     NumberProperties = xlSheet.UsedRange.Columns.Count 

     'create a new collection 
     'http://msdn.microsoft.com/en-us/library/xth2y6ft(v=vs.71).aspx 
     Dim mySTFCollection As New STFCollection 

     For i = 1 To NumberSTF 'rather than a for each loop which would require more excel ranges 

      STFRange = xlSheet.Cells(i + 1, 1) '+1 on row to account for header 
      Name = STFRange.Value.ToString 

      STFRange = xlSheet.Cells(i + 1, 2) 
      Easting = CInt(STFRange.Value) 

      STFRange = xlSheet.Cells(i + 1, 3) 
      Northing = CInt(STFRange.Value) 

      STFRange = xlSheet.Cells(i + 1, 4) 
      tDSpa = CDbl(STFRange.Value) 

      STFRange = xlSheet.Cells(i + 1, 5) 
      Type = STFRange.Value.ToString 

      Dim objSTF As New STF(Name, Easting, Northing, tDSpa, Type) 

      mySTFCollection.Add(objSTF) 

     Next i 

     GC.Collect() 
     GC.WaitForPendingFinalizers() 
     GC.Collect() 
     GC.WaitForPendingFinalizers() 

     ReleaseObject(STFRange) 
     STFRange = Nothing 
     ReleaseObject(xlSheet) 
     xlSheet = Nothing 

     xlBook.Close(True, ,) 
     ReleaseObject(xlBook) 
     xlBook = Nothing 

     xlApp.Quit() 
     ReleaseObject(xlApp) 
     xlApp = Nothing 

    Catch ex As Exception 

     MessageBox.Show(ex.Message) 

    End Try 
End Sub 

Public Sub ReleaseObject(ByVal obj As Object) 

    Try 
     Marshal.ReleaseComObject(obj) 
     obj = Nothing 
    Catch ex As Exception 
     obj = Nothing 
    Finally 
     GC.Collect() 
    End Try 
End Sub 
+1

无法完成。你没有按照它的意图使用excel。 Excel是一个桌面应用程序,互操作是这种怪癖的奖金。这就是为什么MSDN建议避免它,而不是因为他们是一群混蛋:p – banging 2012-08-17 19:42:24

+0

这一定是可能的,我不敢相信。我已经在VBA中完成了从ESRI ArcGIS到Excel的工作,但是无法从VB.net开始工作 – sarkyscouser 2012-09-10 12:50:22

回答

0

第一第一

If File.Exists(ExcelPath) = False Then 
    MessageBox.Show ("Excel file does not exist, exiting.") 
    Exit Sub 
End If 

应该外面的东西Try - End Try并在实例化您的Excel对象之前。如果路径不存在,则指示代码退出该子节点而不进行清理。最后使用GCcollect

这是我最喜欢的处理它

Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
Handles Button1.Click 
     ' 
     '~~> Rest of code 
     ' 

     '~~> Close workbook and quit Excel 
     xlWb.Close (False) 
     xlApp.Quit() 

     '~~> Clean Up 
     releaseObject (xlApp) 
     releaseObject (xlWb) 
End Sub 

Private Sub releaseObject(ByVal obj As Object) 
    Try 
     System.Runtime.InteropServices.Marshal.ReleaseComObject (obj) 
     obj = Nothing 
    Catch ex As Exception 
     obj = Nothing 
    Finally 
     GC.Collect() 
    End Try 
End Sub 

如果你是热衷于从VB.net Excel自动化,那么我会建议你去通过这个link方式。

随访

使用此代码。

Private Sub LoadExcelButton_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    Dim Name As String = "", Type As String = "", ExcelPath As String = "" 
    Dim Easting As Integer = 0, Northing As Integer = 0 
    Dim NumberSTF As Integer = 0, NumberProperties As Integer = 0, i As Integer = 0 
    Dim tDSpa As Double = 0 

    ExcelPath = Me.ExcelPathTextBox.Text.ToString 

    If File.Exists(ExcelPath) = False Then 
     MessageBox.Show("Excel file does not exist, exiting.") 
     Exit Sub 
    End If 

    Dim xlApp As New Excel.Application 
    Dim xlBook As Excel.Workbook = Nothing 
    Dim xlSheet As Excel.Worksheet = Nothing 
    Dim STFRange As Excel.Range = Nothing 

    xlApp.Visible = True 

    xlBook = xlApp.Workbooks.Open(ExcelPath) 

    xlSheet = xlBook.Sheets("STF") 

    NumberSTF = xlSheet.UsedRange.Rows.Count - 1 
    NumberProperties = xlSheet.UsedRange.Columns.Count 

    'create a new collection 
    'http://msdn.microsoft.com/en-us/library/xth2y6ft(v=vs.71).aspx 
    Dim mySTFCollection As New STFCollection 

    For i = 1 To NumberSTF 

     STFRange = xlSheet.Cells(i + 1, 1) 
     Name = STFRange.Value.ToString 

     STFRange = xlSheet.Cells(i + 1, 2) 
     Easting = CInt(STFRange.Value) 

     STFRange = xlSheet.Cells(i + 1, 3) 
     Northing = CInt(STFRange.Value) 

     STFRange = xlSheet.Cells(i + 1, 4) 
     tDSpa = CDbl(STFRange.Value) 

     STFRange = xlSheet.Cells(i + 1, 5) 
     Type = STFRange.Value.ToString 

     Dim objSTF As New STF(Name, Easting, Northing, tDSpa, Type) 

     mySTFCollection.Add(objSTF) 

    Next i 

    '~~> Close the File 
    xlBook.Close(False) 

    '~~> Quit the Excel Application 
    xlApp.Quit() 

    '~~> Clean Up 
    releaseObject(xlSheet) 
    releaseObject(xlBook) 
    releaseObject(xlApp) 
End Sub 

'~~> Release the objects 
Private Sub releaseObject(ByVal obj As Object) 
    Try 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) 
     obj = Nothing 
    Catch ex As Exception 
     obj = Nothing 
    Finally 
     GC.Collect() 
    End Try 
End Sub 
+0

谢谢我明天会试试这个 – sarkyscouser 2012-08-15 16:49:37

+0

好的,所以我已经尝试过了,并没有什么区别,我仍然有一个僵尸坐在那里记忆。 – sarkyscouser 2012-08-17 13:42:50

+0

你能否更新你现在在你的问题中使用的确切代码 – 2012-08-17 13:47:57

0

而不是在您的Excel应用程序调用Close()的,你尝试过Dispose()

您可能想尝试在代码的Finally块中进行清理。

+0

从我所能看到的没有可用的处理方法 – sarkyscouser 2012-09-07 09:18:26