2

我正在尝试使用像数据库这样的 Excel 文件。我已经编写了这段代码来打开我将用来工作的 Excel 文档

Private Sub Importa_XLS(ByVal fileData As String, ByVal dbVuoto As String, ByVal dbDest As String)

    Dim bw As BackgroundWorker = New BackgroundWorker
    bw.WorkerSupportsCancellation = True
    bw.WorkerReportsProgress = True
    If My.Computer.FileSystem.FileExists(dbDest) Then My.Computer.FileSystem.DeleteFile(dbDest)
    My.Computer.FileSystem.CopyFile(dbVuoto, dbDest)

    Dim capitoli As New cCapitoli
    Dim paragrafi As New cParagrafi
    Dim voci As New cVoci

    Dim fileStream As FileStream = New FileStream(fileData, FileMode.Open)
    Dim file(fileStream.Length) As Byte
    Dim percorso As String
    percorso = "C:\Users\User\Desktop\prova.xlsx"
    System.Threading.Thread.Sleep(3000)
    fileStream.Read(file, 0, fileStream.Length)

    fileStream.Close()

    Dim ExcelEngine As ExcelEngine = New ExcelEngine()
    Dim application As IApplication = ExcelEngine.Excel
    Dim workbook As IWorkbook = application.Workbooks.Open(New MemoryStream(file), ExcelOpenType.Automatic)
    bw.CancelAsync()
    Dim gecc As New Syncfusion.GridExcelConverter.GridExcelConverterControl

    For Each sheet As IWorksheet In workbook.Worksheets

        Dim grid As New GridModel
        bw.RunWorkerAsync(percorso)
        System.Threading.Thread.Sleep(3000)
        gecc.ExcelToGrid(sheet, grid)
        bw.CancelAsync()

当编译器执行这条指令gecc.ExcelToGrid(sheet, grid)我等待一分钟,然后 Visual Studio 向我显示这个错误:

CLR 在 60 秒内无法从 COM 上下文 0xcad028 转换到 COM 上下文 0xcad0e0。拥有目标上下文/单元的线程很可能要么进行非泵送等待,要么处理非常长时间运行的操作而不泵送 Windows 消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移不断累积。为避免此问题,所有单线程单元 (STA) 线程都应使用泵送等待原语(例如 CoWaitForMultipleHandles)并在长时间运行的操作期间定期泵送消息。

我在网上阅读了一个解决方案,所以我尝试使用 Backgroundworker,但错误消息仍然存在。也许我不太了解如何使用Backgroundworker。谁能解释我在哪里做错了?

4

0 回答 0