Убить BackgroundWorker в VB.net, если поток зависает, используя COM-объект

У меня есть приложение, которое взаимодействует со сторонними объектами COM. Метод COM-объекта, который я вызываю, иногда перестает отвечать. Я создал поток Backgroundworker для вызова функции, и я пытаюсь отслеживать его из основного потока, чтобы убить его, если он зависает. У меня есть дополнительный код (не прилагается), который отслеживает время обработки с помощью system.timer из основного потока, и я вызываю событие, если оно превышает мой порог (эта часть в порядке). Это когда я хочу убить поток и остановить выполнение кода. Проблема в том, что... если я использую метод cancellasync, он просто будет отложен, поскольку выполнение кода застревает в вызове функции.

Конкретный вызов функции в фрагменте кода, который зависает, это "objCOM.SendDataToServer()". Обычно для возврата требуется 1-3 секунды, но если он не получит ответа, он просто зависнет на неопределенный срок и не вернется вообще (никаких ошибок просто зависает)... тайм-аута нет... а так как у меня нет Доступ к функции источника я не могу предоставить. Я попытался.dispose() метод потока, но, видимо, это не убивает его и не отменяет синхронизацию. Мне просто нужна помощь, чтобы выяснить, как убить этот поток, чтобы я мог сбросить соединение с сервером и снова вызвать функцию. Любая помощь высоко ценится!

Public Class COMobject
    Private objCOM as new acs.manager

    Public Sub CallComFunction()
        Dim bw_com as New Backgroundworker
        AddHandler bw_com.DoWork, AddressOf bw_com_dowork
        AddHandler bw_com.RunWorkerCompleted, AddressOf bw_com_runworkercompleted
        AddHandler bw_com.ProgressChanged, AddressOf bw_com_progresschanged

        bw_com.WorkerReportsProgress = True
        bw_com.RunWorkerAsync()
    End Sub

    Private Sub bw_com_dowork(byval sender as object,byval e as doworkeventargs)
        'this is the long running function that will hang
        call objCOM.SendDataToServer()
    End sub
End Class

1 ответ

Я немного не решаюсь предложить это - но вы можете рассмотреть возможность использования Win32 API - Завершение потока.

Это очень опасный API для использования и может оставить ваше приложение в потенциально опасном / несовместимом состоянии, но для данного сценария - это единственный способ, который я могу придумать.

Если допустимо выполнять работу в отдельном процессе - предложение Ханса Пассанта является лучшим. Гораздо безопаснее завершить процесс, чем поток.

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