Убить 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 для использования и может оставить ваше приложение в потенциально опасном / несовместимом состоянии, но для данного сценария - это единственный способ, который я могу придумать.
Если допустимо выполнять работу в отдельном процессе - предложение Ханса Пассанта является лучшим. Гораздо безопаснее завершить процесс, чем поток.