0

我有一个与第三方 COM 对象交互的应用程序。我调用的 COM 对象的方法有时会停止响应。我创建了一个 Backgroundworker 线程来调用该函数,并且我试图从我的主线程监视它以在它挂起时将其杀死。我有额外的代码(未提供)使用主线程中的 system.timer 跟踪处理时间,如果它超过我的阈值,我会引发一个事件(这部分很好)。这是我想杀死线程并停止代码执行的时候。问题是.. 如果我使用 cancelasync 方法,它只会挂起,因为代码执行卡在函数调用上。

挂起的代码片段中的特定函数调用是“objCOM.SendDataToServer()”。返回通常需要 1-3 秒,但如果它没有得到响应,它将无限期挂起并且根本不会返回(没有错误只是挂起).. 没有超时......因为我没有访问源函数我无法提供。我尝试了线程的 .dispose() 方法,但显然这并没有杀死它,cancelasync 也没有。我只需要帮助弄清楚如何杀死这个线程,这样我就可以重置服务器连接并再次调用该函数。任何帮助深表感谢!

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
4

1 回答 1

0

我有点犹豫是否建议这样做-但您可能要考虑使用Win32 API-Terminate 线程

这是一个非常危险的 API,可能会使您的应用程序处于潜在危险/不一致的状态,但对于给定的场景 - 这是我能想到的唯一方法。

如果允许在单独的过程中执行工作 - Hans Passant 的建议是更好的建议。终止进程比终止线程要安全得多。

于 2012-06-14T13:31:46.957 回答