如果线程挂起,则使用COM对象在VB.net中杀死BackgroundWorker

时间:2012-06-10 04:08:04

标签: wpf vb.net multithreading backgroundworker

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

挂起的代码段中的特定函数调用是“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 个答案:

答案 0 :(得分:0)

我对此提出了一些犹豫 - 但您可能需要考虑使用Win32 API - Terminate thread

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

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