none
Odd Background Worker Crash when invoking a Web Service

    Question

  • This is a very specific situation, where the application crashes only when run on an IBM Blade.
     
    It runs fine on a local PC (Thats also a Quad core like the Blade) and runs fine on multiple VM servers that are hosted on an iSeries.

    The Crash happens exactly at the end of the background worker process, after the processing is finished, that contains the web service.

    Intrestingly enough, Try ... Catch blocks did not catch this.

    To fix this I changed it over to a single threaded mode, however I left the all the Worker Thread code in there as comments.

    The Crash:

    Event Type: Error  
    Event Source:   .NET Runtime 2.0 Error Reporting  
    Event Category: None  
    Event ID:   1000  
    Date:       8/25/2008  
    Time:       10:43:17 AM  
    User:       N/A  
    Computer:   WPDASSQLL01  
    Description:  
    Faulting application orempnameftp.exe, version 1.0.0.0, stamp 48b2ee75, faulting module kernel32.dll, version 5.2.3790.4062, stamp 46264680, debug? 0, fault address 0x0000bee7.  
     
    For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.  
    Data:  
    0000: 41 00 70 00 70 00 6c 00   A.p.p.l.  
    0008: 69 00 63 00 61 00 74 00   i.c.a.t.  
    0010: 69 00 6f 00 6e 00 20 00   i.o.n. .  
    0018: 46 00 61 00 69 00 6c 00   F.a.i.l.  
    0020: 75 00 72 00 65 00 20 00   u.r.e. .  
    0028: 20 00 6f 00 72 00 65 00    .o.r.e.  
    0030: 6d 00 70 00 6e 00 61 00   m.p.n.a.  
    0038: 6d 00 65 00 66 00 74 00   m.e.f.t.  
    0040: 70 00 2e 00 65 00 78 00   p...e.x.  
    0048: 65 00 20 00 31 00 2e 00   e. .1...  
    0050: 30 00 2e 00 30 00 2e 00   0...0...  
    0058: 30 00 20 00 34 00 38 00   0. .4.8.  
    0060: 62 00 32 00 65 00 65 00   b.2.e.e.  
    0068: 37 00 35 00 20 00 69 00   7.5. .i.  
    0070: 6e 00 20 00 6b 00 65 00   n. .k.e.  
    0078: 72 00 6e 00 65 00 6c 00   r.n.e.l.  
    0080: 33 00 32 00 2e 00 64 00   3.2...d.  
    0088: 6c 00 6c 00 20 00 35 00   l.l. .5.  
    0090: 2e 00 32 00 2e 00 33 00   ..2...3.  
    0098: 37 00 39 00 30 00 2e 00   7.9.0...  
    00a0: 34 00 30 00 36 00 32 00   4.0.6.2.  
    00a8: 20 00 34 00 36 00 32 00    .4.6.2.  
    00b0: 36 00 34 00 36 00 38 00   6.4.6.8.  
    00b8: 30 00 20 00 66 00 44 00   0. .f.D.  
    00c0: 65 00 62 00 75 00 67 00   e.b.u.g.  
    00c8: 20 00 30 00 20 00 61 00    .0. .a.  
    00d0: 74 00 20 00 6f 00 66 00   t. .o.f.  
    00d8: 66 00 73 00 65 00 74 00   f.s.e.t.  
    00e0: 20 00 30 00 30 00 30 00    .0.0.0.  
    00e8: 30 00 62 00 65 00 65 00   0.b.e.e.  
    00f0: 37 00 0d 00 0a 00         7.....    
     


    Tuesday, August 26, 2008 6:14 PM

All replies

  • And the Code: Note that this version is the one that works in a single thread mode, however all the code as comments is in there when done with background workers.

    Imports System.Globalization    
    Imports System.IO    
    Imports System.Data.SqlClient    
       
       
    Public Class frmEIDName    
       
        Private WebKSAPI As New KSApi.WebService()    
        Private dsQuery As New DataSet("Parameters")    
        Private qryParms As New apiRequest    
        Private qryJob As New apiJobTitle("Payload1")    
        Private TextInfo = New CultureInfo("en-US"True).TextInfo    
       
        Public Structure ThreadData    
            Public Message As String   
            Public RecordCount As Integer   
            Public TotalRecords As Integer   
        End Structure   
       
        Public bwData As ThreadData    
       
        'Public Overrides Function ToString() As String    
        '    Return "Disabled due to Eval Debugging error with Threads"    
        'End Function    
       
        Private Sub frmEIDName_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load    
       
            Try   
                Me.Show()    
                'Me.bwEIDNameThread.RunWorkerAsync()    
                Me.bwEIDNameThread_DoWork()    
       
            Catch ex As Exception    
                WriteToEventLog("frmEIDName_Load: " + ex.ToString)    
       
            End Try   
       
        End Sub   
       
        'Private Sub bwEIDNameThread_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bwEIDNameThread.DoWork    
        Private Sub bwEIDNameThread_DoWork()    
            Try   
                ftpPPDBEmpNameFile()    
                RebuildEmpNameTable()    
       
            Catch ex As Exception    
                WriteToEventLog("bwEIDNameThread_DoWork: " + ex.ToString)    
       
            End Try   
       
        End Sub   
       
        Private Sub bwEIDNameThread_ProgressChanged(ByVal sender As System.ObjectByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bwEIDNameThread.ProgressChanged    
            'Private Sub bwEIDNameThread_ProgressChanged()    
       
            Invoke(New EIDNameProgressDelegate(AddressOf EIDNameProgress))    
       
        End Sub   
       
        Private Delegate Sub EIDNameProgressDelegate()    
        Private Sub EIDNameProgress()    
            Try   
                lblStatus1.Text = bwData.Message    
                pbStatus.Maximum = bwData.TotalRecords    
                pbStatus.Value = bwData.RecordCount    
                lblStatus2.Text = bwData.RecordCount.ToString + "/" + bwData.TotalRecords.ToString    
                Me.Refresh()    
                Application.DoEvents()    
       
            Catch ex As Exception    
                WriteToEventLog("bwEIDNameThread_ProgressChanged: " + ex.ToString)    
       
            End Try   
       
        End Sub   
       
       
       
        Private Sub bwEIDNameThread_RunWorkerCompleted(ByVal sender As System.ObjectByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bwEIDNameThread.RunWorkerCompleted    
            'Private Sub bwEIDNameThread_RunWorkerCompleted()    
            Invoke(New EIDNameDoneDelegate(AddressOf EIDNameDone))    
       
        End Sub   
       
        Private Delegate Sub EIDNameDoneDelegate()    
        Private Sub EIDNameDone()    
       
            Try   
                If Now.DayOfWeek = DayOfWeek.Friday Then   
                    'Me.bwJobTitleThread.RunWorkerAsync()    
                    Me.bwJobTitleThread_DoWork()    
                Else   
                    Me.Close()    
                End If   
       
            Catch ex As Exception    
                WriteToEventLog("bwEIDNameThread_RunWorkerCompleted: " + ex.ToString)    
       
            End Try   
       
        End Sub   
       
        'Private Sub bwJobTitleThread_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bwJobTitleThread.DoWork    
        Private Sub bwJobTitleThread_DoWork()    
            Try   
                ftpPPDBJobTitleFile()    
                ProcessJobTitles()    
       
            Catch ex As Exception    
                WriteToEventLog("bwJobTitleThread_DoWork: " + ex.ToString)    
       
            End Try   
       
        End Sub   
       
        Private Sub bwJobTitleThread_ProgressChanged(ByVal sender As System.ObjectByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bwJobTitleThread.ProgressChanged    
            'Private Sub bwJobTitleThread_ProgressChanged()    
            Invoke(New JobTitleProgressDelegate(AddressOf JobTitleProgress))    
       
        End Sub   
       
        Private Delegate Sub JobTitleProgressDelegate()    
        Private Sub JobTitleProgress()    
            Try   
                lblStatus1.Text = bwData.Message    
                pbStatus.Maximum = bwData.TotalRecords    
                pbStatus.Value = bwData.RecordCount    
                lblStatus2.Text = bwData.RecordCount.ToString + "/" + bwData.TotalRecords.ToString    
                Me.Refresh()    
                Application.DoEvents()    
       
            Catch ex As Exception    
                WriteToEventLog("bwJobTitleThread_ProgressChanged: " + ex.ToString)    
       
            End Try   
       
        End Sub   
       
        Private Sub bwJobTitleThread_RunWorkerCompleted(ByVal sender As System.ObjectByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bwJobTitleThread.RunWorkerCompleted    
            'Private Sub bwJobTitleThread_RunWorkerCompleted()    
            Invoke(New JobTitleDoneDelegate(AddressOf JobTitleDone))    
       
        End Sub   
        Private Delegate Sub JobTitleDoneDelegate()    
        Private Sub JobTitleDone()    
            Try   
                Me.Close()    
       
            Catch ex As Exception    
                WriteToEventLog("bwJobTitleThread_RunWorkerCompleted: " + ex.ToString)    
       
            End Try   
       
        End Sub   
       
        Private Sub ftpPPDBEmpNameFile()    
       
            Try   
                bwData.Message = "FTP of EID/Name File"   
                bwData.RecordCount = 0    
                bwData.TotalRecords = 1    
       
                'Me.bwEIDNameThread.ReportProgress(0)    
                Me.EIDNameProgress()    
       
                ' Get the current user id and password for FTP    
                Dim user As String = My.Settings.MFU    
                Dim pass As String = My.Settings.MFP    
       
                ' Delete prior file if exists    
                If My.Computer.FileSystem.FileExists(My.Settings.LocalEIDFile) Then   
       
                    My.Computer.FileSystem.DeleteFile(My.Settings.LocalEIDFile)    
       
                End If   
       
                Dim ftpCmds As New FileWriter("ftpcmds.txt"False, FileWriter.CodePage.ISO_8859_1)    
       
                ' Build the FTP commands file    
       
                ftpCmds.Line = "user " & user & " " & pass    
                ftpCmds.Line = "lcd "   
                ftpCmds.Line = "lcd " & My.Computer.FileSystem.CurrentDirectory    
                ftpCmds.Line = "get " & My.Settings.ColumbiaEIDFile & " " & My.Settings.LocalEIDFile    
                ftpCmds.Line = "quit"   
                ftpCmds.Close()    
       
                Shell("cmd /c ""ftp -n -d -s:ftpcmds.txt *server id hidden*"" >ftplog.txt", , True)    
       
                ' Delete temp command file and Save Settings    
       
                ftpCmds.Delete()    
       
                My.Settings.Save()    
       
            Catch ex As Exception    
                WriteToEventLog("ftpPPDBEmpNameFile: " + ex.ToString)    
       
            End Try   
       
        End Sub   
       
        Private Sub RebuildEmpNameTable()    
       
            Try   
                bwData.Message = "Importing EID/Name File to SQL"   
                bwData.RecordCount = 0    
                bwData.TotalRecords = 1    
       
                'Me.bwEIDNameThread.ReportProgress(0)    
                Me.EIDNameProgress()    
       
                Dim user As String = Environment.UserName    
                Dim server As String = Environment.MachineName    
       
                Dim dbConn As SqlConnection = New SqlConnection    
                dbConn.ConnectionString = "Server=" & server & ";Database=LMS_DB_;Trusted_Connection=Yes;"   
       
       
                dbConn.Open()    
       
                Dim sqlComm As SqlCommand = dbConn.CreateCommand    
                sqlComm.CommandText = "EXEC xRedefineEIDName"   
                Try   
                    sqlComm.ExecuteNonQuery()    
       
                Catch ex As SqlException    
                    If ex.Number = 2812 Then   
                        'define the missing stored procedure    
       
                        sqlComm.CommandText = Embedding.GetString("SP_Define.sql")    
                        sqlComm.ExecuteNonQuery()    
                        sqlComm.CommandText = "EXEC xRedefineEIDName"   
                        sqlComm.ExecuteNonQuery()    
                    End If   
                End Try   
       
                ' 8-22-2008 change to Bulk Copy method from individual inserts    
                ' (This Reduced time to 3-4 seconds instead of 15 minutes)    
                Dim EIDNameFile As FileReader = New FileReader(My.Settings.LocalEIDFile)    
       
                Dim sqlBulkCopyProcess As SqlBulkCopy = New SqlBulkCopy(dbConn)    
                Dim record As String   
                Dim LastName As String   
                Const BatchSize As Integer = 2000    
                Dim dtEidName As New xEIDNameTable    
       
                sqlBulkCopyProcess.DestinationTableName = "dbo.xEIDName"   
       
                For Each record In EIDNameFile    
       
                    bwData.RecordCount = EIDNameFile.ReadCount    
                    bwData.TotalRecords = EIDNameFile.MaxRecords    
       
                    LastName = record.Substring(9, 15).Trim    
                    If LastName <> "UNKNOWN" Then   
       
                        '  Send DataTable in Batches of 2000 rows    
                        If dtEidName.Rows.Count >= BatchSize Then   
       
                            'Me.bwEIDNameThread.ReportProgress(0)    
                            Me.EIDNameProgress()    
       
                            sqlBulkCopyProcess.WriteToServer(dtEidName)    
       
                            dtEidName.Clear()    
       
                        End If   
       
                        dtEidName.AddRow()    
       
                        dtEidName.Employee_ID = record.Substring(0, 9)    
                        dtEidName.Last_Name = LastName    
                        dtEidName.First_Name = record.Substring(24, 15).Trim    
                        dtEidName.Mid_name = record.Substring(39, 15).Trim    
       
                    End If   
       
                Next   
       
                ' Send Last Batch to server if any rows remaining to be sent    
                If dtEidName.Rows.Count > 0 Then   
       
                    bwData.Message = "Daily Import Completed"   
                    bwData.RecordCount = EIDNameFile.ReadCount    
                    bwData.TotalRecords = EIDNameFile.MaxRecords    
                    'Me.bwEIDNameThread.ReportProgress(0)    
                    Me.EIDNameProgress()    
       
                    sqlBulkCopyProcess.WriteToServer(dtEidName)    
       
                End If   
       
                dbConn.Close()    
                Me.EIDNameDone()    
       
            Catch ex As Exception    
                WriteToEventLog("RebuildEmpNameTable: " + ex.ToString)    
       
            End Try   
       
        End Sub   
     
    Tuesday, August 26, 2008 6:25 PM
  • Rest of the Code:

        Private Sub ftpPPDBJobTitleFile()    
       
            Try   
                ' Get the current user id and password    
                Dim user As String = My.Settings.MFU    
                Dim pass As String = My.Settings.MFP    
       
                bwData.Message = "FTP of EID/Name File"   
                bwData.RecordCount = 0    
                bwData.TotalRecords = 1    
       
                'Me.bwJobTitleThread.ReportProgress(0)    
                Me.JobTitleProgress()    
       
                ' Delete prior file if exists    
                If My.Computer.FileSystem.FileExists(My.Settings.LocalJobFile) Then   
       
                    My.Computer.FileSystem.DeleteFile(My.Settings.LocalJobFile)    
       
                End If   
       
                Dim ftpCmds As New FileWriter("ftpcmds.txt"False, FileWriter.CodePage.ISO_8859_1)    
       
                ' Build the FTP commands file    
       
                ftpCmds.Line = "user " & user & " " & pass    
                ftpCmds.Line = "lcd "   
                ftpCmds.Line = "lcd " & My.Computer.FileSystem.CurrentDirectory    
                ftpCmds.Line = "get " & My.Settings.ColumbiaJobFile & " " & My.Settings.LocalJobFile    
                ftpCmds.Line = "quit"   
                ftpCmds.Close()    
       
                Shell("cmd /c ""ftp -n -d -s:ftpcmds.txt *Server ID Hidden*"" >ftplog2.txt", , True)    
       
                ' Delete temp command file and Save Settings    
       
                ftpCmds.Delete()    
       
            Catch ex As Exception    
                WriteToEventLog("ftpPPDBJobTitleFile: " + ex.ToString)    
       
            End Try   
       
        End Sub   
       
        Private Sub ProcessJobTitles()    
       
            Try   
                bwData.Message = "Importing Job Title File to SQL"   
                bwData.RecordCount = 0    
                bwData.TotalRecords = 1    
       
                'Me.bwJobTitleThread.ReportProgress(0)    
                Me.JobTitleProgress()    
       
                ' Open Job Titles flat file    
                Dim fileJobTitle As FileReader = New FileReader(My.Settings.LocalJobFile)    
                Dim recJobTitle As New JobTitleRecord    
       
                qryJob.Columns.Remove("JBTTLLCL_ID")    
                dsQuery.Tables.Add(qryParms)    
                dsQuery.Tables.Add(qryJob)    
       
                '8-22-2008 Query Table directly instead of using API to Query database    
                Dim user As String = Environment.UserName    
                Dim server As String = Environment.MachineName    
       
                Dim dbConn As SqlConnection = New SqlConnection    
                dbConn.ConnectionString = "Server=" & server & ";Database=LMS_DB_;Trusted_Connection=Yes;"   
       
                dbConn.Open()    
       
                Dim daJobTitle As New SqlDataAdapter("Select * from JOBTITLE", dbConn)    
                Dim dtJobTitle As New DataTable    
                daJobTitle.Fill(dtJobTitle)    
                Dim pkColumn(1) As DataColumn    
                pkColumn(0) = dtJobTitle.Columns("JBTTL_ID")    
                dtJobTitle.PrimaryKey = pkColumn    
       
                System.Console.WriteLine(WebKSAPI.Url)    
       
                For Each recJobTitle.Line In fileJobTitle    
       
                    bwData.RecordCount = fileJobTitle.ReadCount    
                    bwData.TotalRecords = fileJobTitle.MaxRecords    
                    'Me.bwJobTitleThread.ReportProgress(0)    
                    Me.JobTitleProgress()    
       
                    'Bypass if Appl/Cert Job Title    
                    If recJobTitle.isApplCert() Then   
                    Else   
                        'Convert the Job Title on record to title case     
                        recJobTitle.JobTitle = TextInfo.ToTitleCase(recJobTitle.JobTitle.ToLower)    
       
                        '8-22-2008 Query Table directly instead of using API to Query database    
                        Dim drJobTitle = dtJobTitle.Rows.Find(recJobTitle.JobClassCode)    
       
                        If drJobTitle Is Nothing Then   
       
                            AddNewJobTitle(recJobTitle)    
       
                        End If   
       
                    End If   
       
                Next   
       
                dbConn.Close()    
                Me.JobTitleDone()    
       
            Catch ex As Exception    
                WriteToEventLog("ProcessJobTitles: " + ex.ToString)    
       
            End Try   
       
        End Sub   
       
        Private Sub AddNewJobTitle(ByVal JobRecord As JobTitleRecord)    
       
            Try   
                'Add new Job Title to LMS    
       
                Dim dsAddJob As New DataSet("Parameters")    
                Dim addParms As New apiRequest    
                Dim addJob As New apiJobTitle("Payload1")    
       
                dsAddJob.Tables.Add(addParms)    
                dsAddJob.Tables.Add(addJob)    
       
                'Convert and Trim the Job Title on record to title case     
                JobRecord.JobTitle = TextInfo.ToTitleCase(Trim(JobRecord.JobTitle.ToLower))    
       
                Dim Title As String = JobRecord.JobTitle & " - " & Trim(JobRecord.JobClassCode)    
       
                addJob.JBTTL_ID = Trim(JobRecord.JobClassCode)    
                addJob.JBTTLLCL_TITLE = Title    
                addJob.JBTTLLCL_DESCRIPTION = JobRecord.JobTitle    
                addJob.JBTTLLCL_KEYWORDS = Title    
       
                Try   
       
                    Dim Response As String = WebKSAPI.Call("MKSI.ML.BASE.KS.DataAccess.JobTitle""Create", dsAddJob.GetXml())    
                    Dim dsResponse As DataSet = GetResponseDataset(Response)    
       
                Catch ex As Exception    
                    WriteToEventLog("MKSI.ML.BASE.KS.DataAccess.JobTitle" + ex.ToString)    
                    MsgBox("Exception", MsgBoxStyle.OkOnly, "API Error")    
                End Try   
       
            Catch ex As Exception    
                WriteToEventLog("AddNewJobTitle: ")    
       
            End Try   
       
        End Sub   
       
        Private Function GetResponseDataset(ByVal response As StringAs DataSet    
       
            Try   
                Dim dsResponse As New DataSet()    
                Dim srAny As New StringReader(response)    
       
                dsResponse.ReadXml(srAny)    
       
                Return dsResponse    
       
            Catch ex As Exception    
                WriteToEventLog("frmEIDName_Load: " + ex.ToString)    
                Return Nothing   
       
            End Try   
       
        End Function   
    End Class   
     
    Tuesday, August 26, 2008 6:26 PM
  • Sorry for the Duplicated Posts.  The Submit was showing a "Cannot Process Request" error but evidently it was, so I cleaned them up.
    • Edited by DGavin Tuesday, August 26, 2008 6:40 PM Grammar
    Tuesday, August 26, 2008 6:35 PM