Обнаружена взаимоблокировка переключателя контекста

Я пытаюсь использовать файл 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 не удалось перейти из контекста COM 0xcad028 в контекст COM 0xcad0e0 в течение 60 секунд. Поток, который владеет целевым контекстом / квартирой, скорее всего либо выполняет некачивающее ожидание, либо обрабатывает очень длительную операцию без прокачки сообщений Windows. Эта ситуация, как правило, оказывает негативное влияние на производительность и может даже привести к тому, что приложение перестает отвечать на запросы или постоянно накапливается использование памяти. Чтобы избежать этой проблемы, все потоки однопоточных квартир (STA) должны использовать примитивы перекачки (такие как CoWaitForMultipleHandles) и регулярно перекачивать сообщения во время длительных операций.

Я прочитал онлайн для решения, поэтому я попытался использовать Backgroundworker, но сообщение об ошибке все еще здесь. Может быть, я не очень хорошо понимаю, как использовать Backgroundworker. Может кто-нибудь объяснить мне, где я делаю неправильно?

0 ответов

Другие вопросы по тегам