1

Asp.net では、次のコードを使用して Excel Interop 経由でマルチスレッドを使用する場合:

Public Class ImportService
Public Function ImportsFiles(ByVal files as list(Of String))
Dim rowEffect As Integer = 0
For j as Integer=0 to files.Count-1
dim fileAddress=files(j)
Dim app As New Application
Dim Wbook As Workbook

Try
    Wbook = app.Workbooks.Open(fileAddress, [ReadOnly]:=True)
    For i As Integer = 1 To Wbook.Sheets.Count
        If Not Wbook.Sheets(i).Name.ToString.ToLower.Contains("partial read of load profile") Then
            Dim con As New System.Data.OleDb.OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & fileAddress & "; Extended Properties=""Excel 12.0 Xml;HDR=No;IMEX=1"";")
            Dim cmd As New OleDbCommand
            Dim s As String = "SELECT * FROM [" & Wbook.Sheets(i).Name & "$]"
            cmd.CommandText = s
            cmd.Connection = con
            Dim da As New OleDbDataAdapter
            da.SelectCommand = cmd
            Dim dt As New System.Data.DataTable
            da.Fill(dt)
            Dim err As New Dictionary(Of String, String)
            Dim fileDate As String = Wbook.Sheets(i).Name.ToString.Trim.Replace(" ", "/")
            rowEffect += InsertLps(Path.GetFileName(fileAddress), fileDate, dt.Rows, err)
            dt.Dispose()
            da.Dispose()
            con.Dispose()
            cmd.Dispose()
        End If
        ReleaseCOMObject(Wbook.Sheets(i))
        Next
    Wbook.Close(SaveChanges:=False)
Catch ex As Exception
    summary.Add(fileAddress, ex.Message)
Finally
    GC.Collect()
    GC.WaitForPendingFinalizers()
    GC.Collect()
    GC.WaitForPendingFinalizers()
    If app.Workbooks IsNot Nothing Then
        For Each wb In app.Workbooks
            For Each ws In wb.Worksheets
                ReleaseCOMObject(ws)
            Next
            wb.Close(False)
            ReleaseCOMObject(wb)
        Next
    End If
    app.Workbooks.Close()
    app.Quit()
    ReleaseCOMObject(app)
    GC.WaitForFullGCComplete()
Next
End Function
End Class

エラーが発生します:

この RuntimeCallableWrapper の COM コンテキスト 0x946d20 への移行は、次のエラーで失敗しました: 呼び出されたオブジェクトはクライアントから切断されました。(HRESULT からの例外: 0x80010108 (RPC_E_DISCONNECTED))。これは通常、この RuntimeCallableWrapper が作成された COM コンテキスト 0x946d20 が切断されているか、他の処理でビジー状態になっているためです。現在の COM コンテキスト (COM コンテキスト 0x946c68) からインターフェイスを解放します。これにより、破損やデータ損失が発生する可能性があります。この問題を回避するには、内部に存在する COM コンポーネントを表す RuntimeCallableWrappers でアプリケーションが完全に完了するまで、すべての COM コンテキスト/アパートメント/スレッドが有効なままであり、コンテキスト遷移に使用できることを確認してください。

私は Quartz.net を操作しようとしていますが、より多くのトリガーがバックグラウンドで機能します。2 トリガーがこのコードでジョブを開始する場合:

Public Class ImportJob
Implements IJob
Public Sub Execute(context As IJobExecutionContext) Implements IJob.Execute
    Dim importHelpers As New ImportFilesHelpers
    Dim exts As New List(Of String)
    exts.Add(".xls")
    Dim files = importHelpers.GetFiles(ImportFilesHelpers.BaseAssress, exts)
    Dim import = New ImportService()
    import.ImportsFiles(files)
End Sub
End Class

この行の次のエラー Acoures

Dim fileDate As String = Wbook.Sheets(i).Name.ToString.Trim.Replace(" ", "/")
4

0 に答える 0